Skip to content

feat(memory-core): add dreaming promotion with weighted recall thresholds#60569

Merged
vignesh07 merged 14 commits into
mainfrom
codex/memory-weighted-promotion
Apr 4, 2026
Merged

feat(memory-core): add dreaming promotion with weighted recall thresholds#60569
vignesh07 merged 14 commits into
mainfrom
codex/memory-weighted-promotion

Conversation

@vignesh07

Copy link
Copy Markdown
Member

Summary

  • add short-term recall persistence in both memory_search tool and openclaw memory search CLI paths
  • add openclaw memory promote ranking/apply flow backed by memory/.dreams/short-term-recall.json
  • add managed opt-in dreaming flow that auto-creates/reconciles a nightly cron job and promotes candidates in background
  • set default promotion thresholds to practical starter values: minScore=0.75, minRecallCount=3, minUniqueQueries=2
  • add dreaming docs section and config/UI schema for dreaming settings

Details

  • short-term candidates come from daily files (memory/YYYY-MM-DD.md and basename variant)
  • ranking uses weighted signals: frequency, relevance, query diversity, and temporal recency
  • manual promotion remains available (memory promote) while dreaming is opt-in via config
  • threshold parsing is hardened so invalid negative overrides fall back to defaults

Tests

  • pnpm check
  • pnpm test -- extensions/memory-core/src/short-term-promotion.test.ts extensions/memory-core/src/dreaming.test.ts extensions/memory-core/src/tools.citations.test.ts
  • pnpm test -- extensions/memory-core/src/cli.test.ts
  • pnpm test -- extensions/memory-core/src/tools.test.ts

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation extensions: memory-core Extension: memory-core size: XL maintainer Maintainer-authored PR labels Apr 3, 2026
@vignesh07 vignesh07 requested a review from steipete April 3, 2026 22:31
@vignesh07 vignesh07 marked this pull request as ready for review April 3, 2026 22:31
@greptile-apps

greptile-apps Bot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a short-term memory dreaming/promotion system to memory-core. Recall events from memory_search tool and CLI are persisted to memory/.dreams/short-term-recall.json; a weighted ranking step (frequency, relevance, query diversity, recency) then selects high-signal daily memory entries to promote into MEMORY.md. The feature is opt-in via config (shortTermPromotion.dreaming.enabled) and auto-manages its own nightly cron job through the gateway:startup hook.

The overall architecture is solid — best-effort tracking, atomic writes, and clear threshold defaults. A few issues worth addressing before merge:

  • compareOptionalStrings no-op (dreaming.ts:179): ?? undefined on a string | undefined type is always a no-op, reducing to plain ===, which could silently mask a future bug if the intent was to handle null values from external sources.
  • Optimistic removed-job counter (dreaming.ts:319, 341): Using result.removed !== false treats an absent removed field (undefined) as a confirmed removal, potentially inflating log message counts. Should use === true.
  • limit: 0 silently falls back to the default (dreaming.ts:101–107): normalizePositiveInt treats 0 as invalid and returns DEFAULT_DREAMING_LIMIT = 10, diverging from the CLI path where --limit 0 correctly produces zero candidates.
  • Temp-file name collision (short-term-promotion.ts:307): The ${pid}.${Date.now()} suffix can collide on same-millisecond concurrent writes within the same process, risking silent data loss for a concurrent recall.

Confidence Score: 3/5

Safe to merge with minor fixes; the dreaming flow is best-effort and isolated, but a few correctness issues in logging and temp-file uniqueness should be addressed.

The feature is well-scoped and opt-in with sensible defaults. No security or data-loss risks in the main flow. However, the optimistic removed-counter logic produces misleading logs, the compareOptionalStrings no-op could hide future null-handling bugs, and the same-millisecond temp-file collision is a real (if rare) data-loss path for a best-effort store.

extensions/memory-core/src/dreaming.ts (counter logic, no-op coalescing, limit=0 handling) and extensions/memory-core/src/short-term-promotion.ts (temp-file uniqueness).

Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/memory-core/src/dreaming.ts
Line: 178-180

Comment:
**`compareOptionalStrings` no-op coalescing**

The `?? undefined` on each operand is completely redundant — the type is `string | undefined` (not nullable), so `undefined ?? undefined` is still `undefined`. The function is always equivalent to a plain strict-equality check (`a === b`). While this doesn't cause a functional bug today, it could hide a real error if the intent was to normalise `null` to `undefined` (e.g. values coming from an external API that returns `null`). Consider removing the no-op coalescing or widening the type to `string | null | undefined` if null inputs are genuinely possible:

```suggestion
function compareOptionalStrings(a: string | undefined, b: string | undefined): boolean {
  return a === b;
}
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/memory-core/src/dreaming.ts
Line: 318-323

Comment:
**Optimistic removed-count can mislead log messages**

Both the "disabled" cleanup loop (lines 318–323) and the duplicate-pruning loop (lines 339–344) count a removal as successful when `result.removed !== false`. Because `CronServiceLike.remove` returns `Promise<{ removed?: boolean }>` — the field is _optional_ — a service that returns `{}` (field absent) produces `undefined !== false === true`, so the counter increments even without a confirmed removal. The resulting `logger.info` message then reports a higher-than-real removal count.

Use `=== true` to require an explicit positive acknowledgment:

```suggestion
      const result = await cron.remove(job.id);
      if (result.removed === true) {
        removed += 1;
      }
```

Apply the same fix to the duplicate-pruning loop at lines 339–344.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/memory-core/src/dreaming.ts
Line: 101-107

Comment:
**`limit: 0` silently falls back to the default via `normalizePositiveInt`**

`normalizePositiveInt` treats `0` as invalid (`floored > 0` is false) and returns the fallback (`DEFAULT_DREAMING_LIMIT = 10`). This means a user who sets `shortTermPromotion.dreaming.limit: 0` in config silently gets 10 instead.

The CLI path (`--limit 0`) does correctly produce 0 candidates (via `slice(0, 0)` in `rankShortTermPromotionCandidates`), so there is a behavioural inconsistency between config and CLI for `limit=0`.

If `limit=0` should be a supported "disable" value, use `normalizeNonNegativeInt` instead. If it should be rejected, add a note to the docs so users aren't surprised.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: extensions/memory-core/src/short-term-promotion.ts
Line: 304-310

Comment:
**Temp-file name collision is possible within the same process**

```ts
const tmpPath = `${storePath}.${process.pid}.${Date.now()}.tmp`;
```

Two concurrent calls (e.g. overlapping `recordShortTermRecalls` invocations from two parallel searches in the same process) that land in the same millisecond will generate identical `tmpPath` values. The second `writeFile` call would silently overwrite the first's temp file before either `rename` runs, discarding one write.

Since this is a best-effort store you could widen the uniqueness window cheaply with a random suffix:

```suggestion
  const tmpPath = `${storePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "docs(memory): mark dreaming as experimen..." | Re-trigger Greptile

Comment thread extensions/memory-core/src/dreaming.ts
Comment thread extensions/memory-core/src/dreaming.ts
Comment thread extensions/memory-core/src/dreaming.ts Outdated
Comment thread extensions/memory-core/src/short-term-promotion.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 58f9f0d613

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/memory-core/src/dreaming.ts
Comment thread extensions/memory-core/src/short-term-promotion.ts Outdated
@jalehman

jalehman commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Stoked for this!

@openclaw-barnacle openclaw-barnacle Bot added the gateway Gateway runtime label Apr 3, 2026
@vignesh07

Copy link
Copy Markdown
Member Author

Addressed the Greptile + Codex review points in follow-up commit 2993b27730:

  • dreaming.ts
    • simplified compareOptionalStrings to strict equality
    • changed removal counting to require explicit removed === true
    • aligned config behavior with CLI by allowing dreaming.limit = 0 (no-op cap)
    • broadened startup cron resolution to check context.cron and context.deps.cron
  • openclaw.plugin.json + docs
    • shortTermPromotion.dreaming.limit now allows 0 in schema
    • docs/UI text now explain limit=0 behavior
  • short-term-promotion.ts
    • temp store writes now use unique filenames with randomUUID()
    • added per-store write queue to serialize read-modify-write updates and avoid lost recall increments under concurrent searches
  • gateway wiring
    • src/gateway/server.impl.ts now keeps deps.cron synced at startup and on reload so startup hook context can expose the live cron service

Added/updated tests for:

  • limit 0 config handling
  • startup-event cron extraction
  • unknown remove-result accounting
  • concurrent recall-write preservation

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2993b27730

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/memory-core/src/short-term-promotion.ts Outdated
Comment thread extensions/memory-core/src/short-term-promotion.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7bd3c6d42a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/memory-core/src/tools.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2a88540f80

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread extensions/memory-core/src/tools.ts Outdated
@openclaw-barnacle openclaw-barnacle Bot added the app: web-ui App: web-ui label Apr 4, 2026
@vignesh07 vignesh07 force-pushed the codex/memory-weighted-promotion branch from e3510bc to fd50591 Compare April 4, 2026 01:46

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fd50591153

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +763 to +767
await recordShortTermRecalls({
workspaceDir,
query,
results,
}).catch(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Do not await best-effort recall persistence in CLI search

runMemorySearch still awaits recordShortTermRecalls, so CLI memory search blocks on lock acquisition/disk I/O even though the comment says this path is best-effort. Under concurrent promote/dreaming activity, withShortTermLock can wait up to its timeout before rejecting, which adds avoidable latency to normal search output and can make the command feel hung.

Useful? React with 👍 / 👎.

Comment on lines +329 to +331
if (ageMs > SHORT_TERM_LOCK_STALE_MS) {
await fs.unlink(lockPath).catch(() => undefined);
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Avoid stealing live short-term lock after fixed stale window

The lock is treated as stale solely by file mtime and is forcibly deleted after 60s, but the holder never refreshes mtime while running the critical section. If a promotion/write operation runs longer than that (large MEMORY.md, slow filesystem, paused process), another process can delete the live lock and enter concurrently, reintroducing the lost-update/clobber races this lock is meant to prevent.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a739a75725

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +153 to +155
const nextConfig = updateDreamingModeInConfig(currentConfig, requestedMode);
await api.runtime.config.writeConfigFile(nextConfig);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reconcile dreaming cron when /dreaming updates config

The /dreaming command writes plugins.entries.memory-core.config.dreaming.mode and immediately reports success, but it never triggers cron reconciliation itself. In this change, reconciliation is only wired to the gateway:startup hook in dreaming.ts, so existing managed dreaming jobs can continue running with old settings until a gateway restart/reload cycle completes (and in environments where restart is skipped, the command change may not take effect at all).

Useful? React with 👍 / 👎.

@openclaw-barnacle openclaw-barnacle Bot added channel: whatsapp-web Channel integration: whatsapp-web channel: feishu Channel integration: feishu extensions: openai labels Apr 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 42fb5722a9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +763 to +767
void recordShortTermRecalls({
workspaceDir,
query,
results,
}).catch(() => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Detach CLI recall writes from process lifetime

runMemorySearch fire-and-forgets recordShortTermRecalls, but that promise still executes inside the same one-shot CLI process; when the short-term lock is contended, withShortTermLock can keep retrying until timeout (up to 10s), and those pending timers/I/O keep Node’s event loop alive. In practice openclaw memory search can still feel hung before returning to the shell, despite recall persistence being marked best-effort.

Useful? React with 👍 / 👎.

@vignesh07 vignesh07 force-pushed the codex/memory-weighted-promotion branch from 42fb572 to 3f78160 Compare April 4, 2026 02:43

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3f78160231

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vitest.unit-paths.mjs
Comment on lines 43 to 46
`${BUNDLED_PLUGIN_ROOT_DIR}/**`,
"src/browser/**",
"src/line/**",
"src/acp/**",
"src/agents/**",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Restore ACP exclusion from default unit test selection

Because unitTestIncludePatterns still matches src/**/*.test.ts, dropping "src/acp/**" from unitTestAdditionalExcludePatterns makes ACP tests eligible for the generic vitest.unit.config.ts lane. Those tests already have a dedicated vitest.acp.config.ts path, so this change broadens/duplicates the default pnpm test gate and can materially increase runtime and memory pressure on routine checks.

Useful? React with 👍 / 👎.

@openclaw-barnacle openclaw-barnacle Bot added the channel: telegram Channel integration: telegram label Apr 4, 2026
@vignesh07 vignesh07 force-pushed the codex/memory-weighted-promotion branch from 2f2f9c1 to 0c3a313 Compare April 4, 2026 03:06
@vignesh07 vignesh07 merged commit 4c1022c into main Apr 4, 2026
7 checks passed
@vignesh07 vignesh07 deleted the codex/memory-weighted-promotion branch April 4, 2026 03:26
@openclaw-barnacle openclaw-barnacle Bot removed the channel: whatsapp-web Channel integration: whatsapp-web label Apr 4, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 40e206f68d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread ui/src/ui/app-render.ts
Comment on lines +2027 to +2031
shortTermCount: 0,
longTermCount: 0,
promotedCount: 0,
dreamingOf: null,
nextCycle: null,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Wire dreams view to live promotion metrics

The new Dreams tab always renders hardcoded placeholders (shortTermCount, longTermCount, promotedCount all 0, and nextCycle as null), so it can never reflect actual dreaming/promotion activity. In practice, users will see "0 promoted" and no upcoming cycle even after recalls are promoted, which makes the page inaccurate and misleading rather than a status view.

Useful? React with 👍 / 👎.

KimGLee pushed a commit to KimGLee/openclaw that referenced this pull request Apr 4, 2026
…olds (openclaw#60569)

* memory-core: add dreaming promotion flow with weighted thresholds

* docs(memory): mark dreaming as experimental

* memory-core: address dreaming promotion review feedback

* memory-core: harden short-term promotion concurrency

* acpx: make abort-process test timer-independent

* memory-core: simplify dreaming config with mode presets

* memory-core: add /dreaming command and tighten recall tracking

* ui: add Dreams tab with sleeping lobster animation

Adds a new Dreams tab to the gateway UI under the Agent group.
The tab is gated behind the memory-core dreaming config — it only
appears in the sidebar when dreaming.mode is not 'off'.

Features:
- Sleeping vector lobster with breathing animation
- Floating Z's, twinkling starfield, moon glow
- Rotating dream phrase bubble (17 whimsical phrases)
- Memory stats bar (short-term, long-term, promoted)
- Active/idle visual states
- 14 unit tests

* plugins: fix --json stdout pollution from hook runner log

The hook runner initialization message was using log.info() which
writes to stdout via console.log, breaking JSON.parse() in the
Docker smoke test for 'openclaw plugins list --json'. Downgrade to
log.debug() so it only appears when debugging is enabled.

* ui: keep Dreams tab visible when dreaming is off

* tests: fix contracts and stabilize extension shards

* memory-core: harden dreaming recall persistence and locking

* fix: stabilize dreaming PR gates (openclaw#60569) (thanks @vignesh07)

* test: fix rebase drift in telegram and plugin guards
lovewanwan pushed a commit to lovewanwan/openclaw that referenced this pull request Apr 28, 2026
…olds (openclaw#60569)

* memory-core: add dreaming promotion flow with weighted thresholds

* docs(memory): mark dreaming as experimental

* memory-core: address dreaming promotion review feedback

* memory-core: harden short-term promotion concurrency

* acpx: make abort-process test timer-independent

* memory-core: simplify dreaming config with mode presets

* memory-core: add /dreaming command and tighten recall tracking

* ui: add Dreams tab with sleeping lobster animation

Adds a new Dreams tab to the gateway UI under the Agent group.
The tab is gated behind the memory-core dreaming config — it only
appears in the sidebar when dreaming.mode is not 'off'.

Features:
- Sleeping vector lobster with breathing animation
- Floating Z's, twinkling starfield, moon glow
- Rotating dream phrase bubble (17 whimsical phrases)
- Memory stats bar (short-term, long-term, promoted)
- Active/idle visual states
- 14 unit tests

* plugins: fix --json stdout pollution from hook runner log

The hook runner initialization message was using log.info() which
writes to stdout via console.log, breaking JSON.parse() in the
Docker smoke test for 'openclaw plugins list --json'. Downgrade to
log.debug() so it only appears when debugging is enabled.

* ui: keep Dreams tab visible when dreaming is off

* tests: fix contracts and stabilize extension shards

* memory-core: harden dreaming recall persistence and locking

* fix: stabilize dreaming PR gates (openclaw#60569) (thanks @vignesh07)

* test: fix rebase drift in telegram and plugin guards
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
…olds (openclaw#60569)

* memory-core: add dreaming promotion flow with weighted thresholds

* docs(memory): mark dreaming as experimental

* memory-core: address dreaming promotion review feedback

* memory-core: harden short-term promotion concurrency

* acpx: make abort-process test timer-independent

* memory-core: simplify dreaming config with mode presets

* memory-core: add /dreaming command and tighten recall tracking

* ui: add Dreams tab with sleeping lobster animation

Adds a new Dreams tab to the gateway UI under the Agent group.
The tab is gated behind the memory-core dreaming config — it only
appears in the sidebar when dreaming.mode is not 'off'.

Features:
- Sleeping vector lobster with breathing animation
- Floating Z's, twinkling starfield, moon glow
- Rotating dream phrase bubble (17 whimsical phrases)
- Memory stats bar (short-term, long-term, promoted)
- Active/idle visual states
- 14 unit tests

* plugins: fix --json stdout pollution from hook runner log

The hook runner initialization message was using log.info() which
writes to stdout via console.log, breaking JSON.parse() in the
Docker smoke test for 'openclaw plugins list --json'. Downgrade to
log.debug() so it only appears when debugging is enabled.

* ui: keep Dreams tab visible when dreaming is off

* tests: fix contracts and stabilize extension shards

* memory-core: harden dreaming recall persistence and locking

* fix: stabilize dreaming PR gates (openclaw#60569) (thanks @vignesh07)

* test: fix rebase drift in telegram and plugin guards
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
…olds (openclaw#60569)

* memory-core: add dreaming promotion flow with weighted thresholds

* docs(memory): mark dreaming as experimental

* memory-core: address dreaming promotion review feedback

* memory-core: harden short-term promotion concurrency

* acpx: make abort-process test timer-independent

* memory-core: simplify dreaming config with mode presets

* memory-core: add /dreaming command and tighten recall tracking

* ui: add Dreams tab with sleeping lobster animation

Adds a new Dreams tab to the gateway UI under the Agent group.
The tab is gated behind the memory-core dreaming config — it only
appears in the sidebar when dreaming.mode is not 'off'.

Features:
- Sleeping vector lobster with breathing animation
- Floating Z's, twinkling starfield, moon glow
- Rotating dream phrase bubble (17 whimsical phrases)
- Memory stats bar (short-term, long-term, promoted)
- Active/idle visual states
- 14 unit tests

* plugins: fix --json stdout pollution from hook runner log

The hook runner initialization message was using log.info() which
writes to stdout via console.log, breaking JSON.parse() in the
Docker smoke test for 'openclaw plugins list --json'. Downgrade to
log.debug() so it only appears when debugging is enabled.

* ui: keep Dreams tab visible when dreaming is off

* tests: fix contracts and stabilize extension shards

* memory-core: harden dreaming recall persistence and locking

* fix: stabilize dreaming PR gates (openclaw#60569) (thanks @vignesh07)

* test: fix rebase drift in telegram and plugin guards
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
…olds (openclaw#60569)

* memory-core: add dreaming promotion flow with weighted thresholds

* docs(memory): mark dreaming as experimental

* memory-core: address dreaming promotion review feedback

* memory-core: harden short-term promotion concurrency

* acpx: make abort-process test timer-independent

* memory-core: simplify dreaming config with mode presets

* memory-core: add /dreaming command and tighten recall tracking

* ui: add Dreams tab with sleeping lobster animation

Adds a new Dreams tab to the gateway UI under the Agent group.
The tab is gated behind the memory-core dreaming config — it only
appears in the sidebar when dreaming.mode is not 'off'.

Features:
- Sleeping vector lobster with breathing animation
- Floating Z's, twinkling starfield, moon glow
- Rotating dream phrase bubble (17 whimsical phrases)
- Memory stats bar (short-term, long-term, promoted)
- Active/idle visual states
- 14 unit tests

* plugins: fix --json stdout pollution from hook runner log

The hook runner initialization message was using log.info() which
writes to stdout via console.log, breaking JSON.parse() in the
Docker smoke test for 'openclaw plugins list --json'. Downgrade to
log.debug() so it only appears when debugging is enabled.

* ui: keep Dreams tab visible when dreaming is off

* tests: fix contracts and stabilize extension shards

* memory-core: harden dreaming recall persistence and locking

* fix: stabilize dreaming PR gates (openclaw#60569) (thanks @vignesh07)

* test: fix rebase drift in telegram and plugin guards
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: web-ui App: web-ui channel: feishu Channel integration: feishu docs Improvements or additions to documentation extensions: acpx extensions: memory-core Extension: memory-core gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants