Skip to content

Comments

feat(cron): add default delivery settings and improve mode normalization#24

Closed
dgarson wants to merge 946 commits intomainfrom
autodev-cron-delivery-defaults
Closed

feat(cron): add default delivery settings and improve mode normalization#24
dgarson wants to merge 946 commits intomainfrom
autodev-cron-delivery-defaults

Conversation

@dgarson
Copy link
Owner

@dgarson dgarson commented Feb 9, 2026

Summary

Adds global default delivery settings for cron jobs and improves delivery mode normalization.

Changes

  • CronDeliveryDefaults type — New config type for global delivery settings (enabled, mode, channel, to)
  • normalizeMode() — Centralized mode normalization (announce/deliver/none)
  • normalizeDefaultDelivery() — Validates and normalizes default delivery config
  • Fallback chain — Job delivery > payload > defaults > 'last'
  • Legacy fixdeliver: false now correctly returns mode: 'none'
  • Zod schema — Added defaultDelivery to cron config schema with validation
  • Timer integration — Passes defaults to delivery plan resolution

Why

Cron delivery was causing failures when jobs had misconfigured or missing delivery settings. This adds a global default fallback so jobs that don't specify delivery get a reasonable default, and fixes edge cases in mode normalization.

Tests

  • 9 tests passing across 3 test files:
    • config.cron-default-delivery.test.ts (2 tests)
    • delivery.test.ts (4 tests)
    • service.delivery-plan.test.ts (3 tests)

Verification

pnpm build && npx vitest run src/cron/delivery.test.ts src/cron/service.delivery-plan.test.ts src/config/config.cron-default-delivery.test.ts

dgarson and others added 30 commits February 6, 2026 19:25
Implement a comprehensive scoring system that evaluates whether experiences
should become long-term memories based on five weighted factors:

- **Novelty**: Is this new information or repetition?
- **Impact**: Does this change understanding, behavior, or system state?
- **Relational**: Does this connect to known entities/people/projects?
- **Temporal**: Is this time-sensitive or evergreen?
- **User Intent**: Was this explicitly marked as important?

Features:
- Configurable weights for each factor (normalized to sum to 1.0)
- Named threshold profiles: balanced, aggressive, conservative, minimal
- Override rules for specific tools (glob-pattern matching)
- evaluateMemoryRelevance() as primary entry point
- shouldCapture(), shouldPersistToGraph(), shouldUseLlmEval() helpers
- Backward-compatible evaluateHeuristic() now delegates to scoring system
- New evaluateHeuristicDetailed() returns full scoring breakdown
- 37 comprehensive tests covering all factors and edge cases

Files:
- extensions/meridia/src/meridia/scoring/types.ts
- extensions/meridia/src/meridia/scoring/config.ts
- extensions/meridia/src/meridia/scoring/factors.ts
- extensions/meridia/src/meridia/scoring/index.ts
- extensions/meridia/src/meridia/scoring/scoring.test.ts
- extensions/meridia/src/meridia/evaluate.ts (updated)
…7) (openclaw#202)

Implements a comprehensive, configurable scoring system for determining
which experiences should become long-term memories.

## New Module: scoring/

- **types.ts**: Full type definitions for factors, breakdowns, configs
- **factors.ts**: Five factor scorers (novelty, impact, relational, temporal, userIntent)
- **scorer.ts**: Composite scorer with tool/pattern overrides, threshold profiles
- **defaults.ts**: Default weights, profiles (standard/aggressive/conservative), overrides
- **index.ts**: Barrel exports

## Factor Scoring Model

- **Novelty (0.25)**: Detects repetitive vs. new tool usage patterns
- **Impact (0.30)**: Classifies tool types (high/medium/low impact), error detection, meta keywords
- **Relational (0.15)**: Entity detection via tags, keywords, file paths, URLs
- **Temporal (0.10)**: Time-of-day awareness, burst detection, pacing analysis
- **User Intent (0.20)**: Explicit marks, manual captures, intent keywords

## Override System

- Tool-specific rules: fixedScore, minScore, maxScore, weightMultiplier
- Pattern-based rules: error boost, large result detection, tag matching
- User intent override: highest priority

## Integration

- Updated evaluate.ts with evaluateRelevance() bridge function
- Updated config.ts with scoring config resolution (backwards compatible)
- Re-exports for convenience: shouldCaptureMultiFactor, isHighValueMultiFactor, etc.
- breakdownToTrace() for compact trace event embedding

## Tests

- 48 tests across factors.test.ts and scorer.test.ts
- All passing
feat(meridia): multi-factor memory relevance scoring system
feat: add configurable subsystem debug log suppression
* refactor(tools): create shared tool execution module

* refactor(pi): use shared tool execution in pi-tool-definition-adapter

* refactor(sdk): use shared tool execution in tool-bridge

* test(tools): add tests for shared tool execution module

* docs: add unified tool execution coverage gap analysis

* fix(auto-reply): use unified tool execution for inline skill commands

* docs(tools): document wrapper reliance on runtime adapters

* test(auto-reply): add inline skill command error handling tests

* docs: update gap analysis with completed fixes

* fix: missing stuff
)

- Consolidate /agents/dashboard and /agent-status into a single route with grid/list layout toggle
- Reduce summary cards from 7-8 to 4 primary + conditional stalled/errored alert chips
- Declutter agent cards: combined session counts, cron badge in header, no redundant health metric
- Fix detail panel on mobile: use Sheet overlay on sub-lg screens instead of hidden panel
- Lighten activity timeline: borderless rows for completed items, full Card only for live tasks
- Add inline metadata stats (duration, tokens, cost) on timeline rows
- Batch consecutive search/code activities into collapsible groups
- Remove hardcoded mock data fallback in AgentActivityTab; show empty state instead
- Add keyboard navigation (ArrowUp/Down, Escape) and aria-live for screen readers
- Group developer actions (Copy ID, Copy JSON) into overflow dropdown menu
- Promote session section above generic actions in detail panel
- Extract shared format utilities (formatTokenCount, formatRelativeTime, etc.) into lib/format.ts
- Improve Lit dashboard: CSS grid metrics, channel badges, right-aligned tokens, hover highlights

Co-authored-by: Claude <[email protected]>
Evaluates the original Meridia V2 architecture proposal against the
actual codebase state and existing architecture docs (ARCH.md,
COMPONENT-MAP.md, 7 component deep-dives). Produces a refined plan
that builds on the designed 14-component system rather than
reinventing it.

Key refinements over the original proposal:
- Two-pass evaluation (cheap gate, expensive phenomenology only on
  captured events) instead of full LLM extraction on every tool result
- Compaction-based graph sync with session-end mini-compaction instead
  of per-event Graphiti writes
- Vector search adapter interface (Graphiti vector first, pgvector
  optional) instead of hard PostgreSQL dependency
- Includes missing components (normalizer, gates, sanitization) the
  original proposal omitted
- Migrates to ExperienceKit type from COMPONENT-MAP rather than
  extending MeridiaExperienceRecord
- 5-phase implementation plan with dependency ordering

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE
…l, and reconstitution

Implements the Meridia V2 plan across all 14 components from COMPONENT-MAP.md:

**New modules (26 files):**
- event/normalizer: Component 1 — typed MeridiaEvent envelopes from hook payloads
- gates/budget: Component 2 — rate limits and capture budgets (extracted from hook)
- phenomenology/{taxonomy,prompt,heuristic,extractor}: Component 4 — two-pass
  phenomenological extraction with controlled vocabularies (17 emotions, 5 engagement
  qualities, 12 texture metaphors, 5 sensory channels from experiential-engine docs)
- artifacts/collector: Component 5 — file/link/media reference extraction
- kit/{builder,resolver}: Component 6 + Phase 5 — ExperienceKit assembly and
  meridia://<id> URI resolution
- sanitize/redact: Component 12 — secret redaction and payload truncation
- retrieve/{intent,ranker,hybrid,vector-adapter}: Component 10 — hybrid retrieval
  with blended ranking (significance, recency, diversity, source score)
- reconstitution/{engine,pack-builder}: Component 11 — structured ReconstitutionPack
  replacing bullet-list format with narrative, anchors, uncertainties, approach guidance
- fanout/dispatcher: Component 9 — fire-and-forget async dispatch with error isolation

**Updated existing files:**
- types.ts: Added Phenomenology, CaptureDecision, ArtifactRef, ExperienceKit,
  ReconstitutionPack types; added phenomenology field to legacy record
- hooks/experiential-capture: Uses normalizer, gates, phenomenology extractor,
  artifact collector, kit builder, and sanitizer
- hooks/meridia-reconstitution: Uses enhanced reconstitution engine with legacy fallback
- db/backends/sqlite.ts: Schema v2 migration (phenomenology columns), updated FTS
  searchable text, v1→v2 migration is idempotent
- meridia-search-adapter: Implements readFile() for meridia:// URI resolution,
  includes phenomenology in search snippets
- tools: Fixed pre-existing async/await issues across all three experience tools
- tests: Fixed async/await in sqlite and reflect tool tests, updated schema assertions

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE
…#208)

* feat: added work-queue workflow workers and a worker manager, integrate w/cron

* fix: address 12 logic flaws in workflow engine, adapter, phases, and cron types

- engine: capture phase before clobbering in catch handler (#1)
- engine: remove dead `state.plan ?? plan` fallback (#2)
- engine: mark workflow failed when all execution nodes fail (#6)
- adapter: fix retry count off-by-one (attemptNumber vs retryCount) (#3)
- adapter: clean up abort listener in sleep on timeout (#10)
- discover: fix batch/entries index mismatch when spawns fail (#4)
- execute: add cycle detection to topological sort (#5)
- review: add autoApproved flag to distinguish fallback approvals (#7)
- plan: add comment clarifying sessionKey reuse across repair attempts (#8)
- decompose: remove unused model/maxPhases/maxTasksPerPhase/maxSubtasksPerTask opts (#9)
- types: add autoApproved to ReviewIteration (#7)
- cron/state: use discriminated union for CronEvent (CronJobEvent | CronHealthEvent) (#12)
- tests: add WorkflowWorkerAdapter test suite (8 tests) (#11)

https://claude.ai/code/session_01L8kquwpmUh5zmU9S4MHgPu

---------

Co-authored-by: Claude <[email protected]>
…aSearchAdapter

Fixes P1 and P2 issues from code review:
- search() now properly awaits backend.searchRecords() (was calling .map on a Promise)
- status() now async with await on backend.getStats() (was reading undefined properties)
Resolved conflicts by accepting origin/main versions which include:
- Type-safe discriminated unions for CronEvent (job vs health events)
- Better workflow execution semantics (attemptNumber vs retryCount)
- Improved error handling and phase tracking in workflow engine
- Bug fixes for discovery question-to-result alignment
- Cycle detection in topological sort
- Auto-approval tracking in review iterations

All conflicts resolved in favor of main's improvements.

Co-Authored-By: Claude Sonnet 4.5 <[email protected]>
…ntial backoff

- RetryableError: composable error boundary with visual retry feedback
- useRetry: React hook with exponential backoff, jitter, countdown timer
- withRetry: standalone retry utility for non-React contexts
- Comprehensive test suite with 10 test cases
- Card and inline variants, auto-retry option, cancel/reset controls

Closes P4 Error Handling UX: retry patterns for failed operations
- GlobalSearchDialog: full-featured search overlay powered by useGlobalSearch hook
- Category filter chips for narrowing results by type (agents, sessions, goals, etc.)
- Recent searches persisted to localStorage
- Keyboard shortcut Cmd+Shift+F / Ctrl+Shift+F to open
- Search button added to sidebar with keyboard hint
- Score-based ranking with grouped category results
- Comprehensive test suite for keyboard shortcut hook

Wires up the existing useGlobalSearch hook into a production-ready UI.
Addresses P4 Search & Filtering from BACKLOG.md.
…nclaw#211)

* [autodev] Command Palette: Add nested sub-command menus and category filtering

Task 1 - Nested/sub-command menus:
- Replaced single page state with a page stack (PageEntry[]) for arbitrary nesting depth
- Added per-agent sub-menus: Agents > {AgentName} > View Details/Chat/Sessions/Edit Config
- Multi-level breadcrumb navigation with clickable intermediate crumbs
- Back navigation via Backspace (empty search) or clicking breadcrumb entries
- Agent sub-pages show agent info (role, status, current task)

Task 2 - Category filtering in search:
- Added filter chips bar that appears when searching on root page
- Categories: All, Quick Actions, Navigation, Agents, Appearance, Settings
- Active filter highlighted with primary color, dismissible via X button
- When filtering, shows all items in that category (not just top 3/5)
- Appearance and Settings items surface in search results when filtering

* [autodev] Mark command palette nested menus and category filtering as complete
…aw#212)

* [autodev] Add progress indicators for long-running operations

New components:
- useAsyncOperation hook: State machine (idle → running → success/error)
  with progress tracking, auto-reset, and callbacks
- OperationProgress component: Visual indicator with three variants
  (inline, banner, compact) showing progress bar, step info, error/retry

Features:
- Step-by-step progress reporting (current/total/message/percent)
- Indeterminate progress bar for operations without step count
- Auto-reset to idle after configurable timeout
- Error state with retry button
- Success state with dismiss option
- Three display variants: inline (card), banner (full-width), compact (single-line)

Test coverage: 10 tests (all passing) covering state transitions,
progress tracking, auto-reset, callbacks, error handling

Barrel exports added to composed/index.ts and hooks/index.ts

* [autodev] Mark progress indicators task as complete
- Gap 1 (HIGH): Add streaming block replies during the event loop via
  blockReplyBreak/blockReplyChunking params. Supports "message_end"
  (flush at message boundaries) and "text_end" (per-chunk) modes,
  matching Pi embedded's streaming delivery. Final onBlockReply is
  skipped when streaming was active to avoid duplicate delivery.

- Gap 2 (MEDIUM): Add onReasoningStream callback support. Extract
  thinking/reasoning text from SDK events classified as "system" and
  emit via the new callback, enabling reasoning display in UIs.

- Gap 3 (MEDIUM): Reset chunks/assistantSoFar at message boundaries
  so onPartialReply reflects only the current message, not accumulated
  text from all prior turns.

- Gap 5 (LOW-MED): Add enforceFinalTag support. When enabled, only
  content inside <final>...</final> tags is returned, preventing
  intermediate narration leakage from non-Claude models. Adds shared
  extractFinalTagContent() utility.

- Gap 6 (LOW-MED): Map all payload fields (mediaUrl, mediaUrls,
  replyToId, replyToTag, replyToCurrent, audioAsVoice) in
  adaptSdkResultToPiResult to prevent silent field loss.

Wire all new params through the full chain:
  executor.ts → AgentRuntimeRunParams → sdk-agent-runtime →
  sdk-runner-adapter → sdk-runner

https://claude.ai/code/session_013FRzxnpzCwncubghL7GGCF
Resolve merge conflicts in meridia scoring module by taking
origin/main's refactored multi-factor scoring system (scorer.ts,
defaults.ts, updated types/factors/index). Remove HEAD-only
scoring/config.ts and scoring.test.ts that used the old API
(origin/main has proper tests in factors.test.ts and scorer.test.ts).

Co-Authored-By: Claude Opus 4.6 <[email protected]>
…cron types (openclaw#217)

- engine: capture phase before clobbering in catch handler (#1)
- engine: remove dead `state.plan ?? plan` fallback (#2)
- engine: mark workflow failed when all execution nodes fail (#6)
- adapter: fix retry count off-by-one (attemptNumber vs retryCount) (#3)
- adapter: clean up abort listener in sleep on timeout (#10)
- discover: fix batch/entries index mismatch when spawns fail (#4)
- execute: add cycle detection to topological sort (#5)
- review: add autoApproved flag to distinguish fallback approvals (#7)
- plan: add comment clarifying sessionKey reuse across repair attempts (#8)
- decompose: remove unused model/maxPhases/maxTasksPerPhase/maxSubtasksPerTask opts (#9)
- types: add autoApproved to ReviewIteration (#7)
- cron/state: use discriminated union for CronEvent (CronJobEvent | CronHealthEvent) (#12)
- tests: add WorkflowWorkerAdapter test suite (8 tests) (#11)

https://claude.ai/code/session_01L8kquwpmUh5zmU9S4MHgPu

Co-authored-by: Claude <[email protected]>
* feat: event system for meridia

* fix: archive buffered moments after session summary to prevent inflation

Buffered moments were never transitioned after being consumed by
session-capture, causing them to be re-counted on every subsequent
/new command. Now transitions them to 'archived' after saving the summary.

Co-Authored-By: Claude Opus 4.6 <[email protected]>

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
* feat: add configurable subsystem debug log suppression

* docs: add changelog entry and test script for suppressSubsystemDebugLogs

* docs: add implementation summary

* feat(meridia): multi-factor memory relevance scoring system

Implement a comprehensive scoring system that evaluates whether experiences
should become long-term memories based on five weighted factors:

- **Novelty**: Is this new information or repetition?
- **Impact**: Does this change understanding, behavior, or system state?
- **Relational**: Does this connect to known entities/people/projects?
- **Temporal**: Is this time-sensitive or evergreen?
- **User Intent**: Was this explicitly marked as important?

Features:
- Configurable weights for each factor (normalized to sum to 1.0)
- Named threshold profiles: balanced, aggressive, conservative, minimal
- Override rules for specific tools (glob-pattern matching)
- evaluateMemoryRelevance() as primary entry point
- shouldCapture(), shouldPersistToGraph(), shouldUseLlmEval() helpers
- Backward-compatible evaluateHeuristic() now delegates to scoring system
- New evaluateHeuristicDetailed() returns full scoring breakdown
- 37 comprehensive tests covering all factors and edge cases

Files:
- extensions/meridia/src/meridia/scoring/types.ts
- extensions/meridia/src/meridia/scoring/config.ts
- extensions/meridia/src/meridia/scoring/factors.ts
- extensions/meridia/src/meridia/scoring/index.ts
- extensions/meridia/src/meridia/scoring/scoring.test.ts
- extensions/meridia/src/meridia/evaluate.ts (updated)

* SDK runner: close message processing parity gaps with Pi embedded agent

- Gap 1 (HIGH): Add streaming block replies during the event loop via
  blockReplyBreak/blockReplyChunking params. Supports "message_end"
  (flush at message boundaries) and "text_end" (per-chunk) modes,
  matching Pi embedded's streaming delivery. Final onBlockReply is
  skipped when streaming was active to avoid duplicate delivery.

- Gap 2 (MEDIUM): Add onReasoningStream callback support. Extract
  thinking/reasoning text from SDK events classified as "system" and
  emit via the new callback, enabling reasoning display in UIs.

- Gap 3 (MEDIUM): Reset chunks/assistantSoFar at message boundaries
  so onPartialReply reflects only the current message, not accumulated
  text from all prior turns.

- Gap 5 (LOW-MED): Add enforceFinalTag support. When enabled, only
  content inside <final>...</final> tags is returned, preventing
  intermediate narration leakage from non-Claude models. Adds shared
  extractFinalTagContent() utility.

- Gap 6 (LOW-MED): Map all payload fields (mediaUrl, mediaUrls,
  replyToId, replyToTag, replyToCurrent, audioAsVoice) in
  adaptSdkResultToPiResult to prevent silent field loss.

Wire all new params through the full chain:
  executor.ts → AgentRuntimeRunParams → sdk-agent-runtime →
  sdk-runner-adapter → sdk-runner

https://claude.ai/code/session_013FRzxnpzCwncubghL7GGCF

* additional merge conflict resolution

---------

Co-authored-by: Claude <[email protected]>
* feat: meridian memory clasiffication

* fix: minor safety check around config missing
…ross 13 files) (openclaw#207)

Cover all new V2 modules: event normalizer, gates/budget, sanitize/redact,
phenomenology (taxonomy, prompt, heuristic), artifacts collector, kit builder
and resolver, retrieve (intent, ranker, vector-adapter), reconstitution
pack-builder, and fanout dispatcher. Export renderKit from resolver for
testability.

https://claude.ai/code/session_01Ko4xrCYytJBNW5VAxzfemE

Co-authored-by: Claude <[email protected]>
dgarson and others added 27 commits February 9, 2026 00:48
…w#397)

The finalizeJobRun function expects startedAtMs in its opts parameter,
but ops.ts was passing runAtMs which doesn't exist in the type. This
caused the plugin-sdk:dts build step to fail with TS2353.
…w#398)

The finalizeJobRun function expects startedAtMs in its opts parameter,
but ops.ts was passing runAtMs which doesn't exist in the type. This
caused the plugin-sdk:dts build step to fail with TS2353.
…stions, threshold validation, and power-user gating (openclaw#396)

* feat: add Debug & Logging config section to Settings UI

Add a new "Debug & Logging" section in the Admin/Power User settings
that provides a full UI for tuning openclaw.json logging and debugging
configuration. Gated behind Power User Mode.

Covers:
- Log level / console level / console style selectors
- Redact sensitive toggle
- Enhanced logging feature toggles (tool errors, perf outliers, etc.)
- Performance threshold sliders (tool call, agent turn, gateway, db op)
- Token warning threshold sliders
- Tool journal config (enable, file path, retention, redaction)
- Suppress subsystem debug logs tag list
- Channel debug overrides (add/remove with verbose/debug/trace/suppress)
- Feature debug overrides (add/remove with verbose/debug/trace/suppress)
- Sticky save/reset bar with dirty state tracking

https://claude.ai/code/session_011WdpEacHmK1fMQMFiD3Szu

* fix: address data loss, UX gaps, and missing fields in debug/logging config

Fixes:
- Preserve ALL config fields on save (file, redactPatterns, journal.toolFilter,
  enhanced.gatewayHealthSuppressMethods) via index signature and full-object
  patching — previously saving clobbered unmodeled fields
- Fix dead ternary in enhanced logging defaults (both branches were `true`)
- Add proper error state when gateway/config fails to load
- Add beforeunload guard to prevent losing unsaved changes on navigation
- Token threshold cross-validation: prevent warning >= critical with inline
  error message and disabled save button
- Gate "Debug & Logging" nav item behind power user mode in both desktop
  and mobile navs (was visible to all users before)

New config fields exposed:
- logging.file (log file path)
- logging.redactPatterns (custom regex redaction patterns)
- logging.journal.toolFilter (scope journal to specific tools)
- logging.enhanced.gatewayHealthSuppressMethods (suppress health logs
  for specific RPC methods)

UX improvements:
- Channel autocomplete suggestions from useChannelsStatusFast() gateway data
- Feature autocomplete suggestions from known codebase feature IDs
- Extracted reusable TagListEditor component for string[] config fields
- Quick-add badge chips for one-click channel/feature addition

https://claude.ai/code/session_011WdpEacHmK1fMQMFiD3Szu

* tests: relax cron timer timezone expectation

* Fix journal toggle default and tool filter help text in DebugLoggingSection (openclaw#399)

- Default the journal enabled toggle to true (was false), matching the
  runtime behavior where startJournalSubscriber treats undefined as enabled
- Update tool filter help text to reflect actual backend default
  (DEFAULT_JOURNAL_TOOLS subset) instead of claiming "all tools"
- Expand journal sub-settings when enabled field is unset (consistent
  with the new default-true toggle)

https://claude.ai/code/session_011jGYfDDmG4hSUMkct6YsjR

Co-authored-by: Claude <[email protected]>

---------

Co-authored-by: Claude <[email protected]>
* worker fixes

* feat(web): add Playwright test mode to bypass auth guards

- Add VITE_PLAYWRIGHT_TEST_MODE env var to disable all auth
- Create isPlaywrightTestMode() utility in src/lib/test-mode.ts
- Bypass GatewayAuthGuard, OnboardingGuard, UnlockGuard in test mode
- SecurityProvider returns always-unlocked state in test mode
- Skip gateway auto-connect in test mode (main.tsx)
- Root layout renders with AppShell but skips all guard wrappers
- Add visual '🎭 Playwright Test Mode' banner when active
- Add dev:test and dev:playwright npm scripts
- Add .env.playwright config file

Usage:
  pnpm dev:playwright
  # or
  VITE_PLAYWRIGHT_TEST_MODE=true pnpm dev
* feat: add Debug & Logging config section to Settings UI

Add a new "Debug & Logging" section in the Admin/Power User settings
that provides a full UI for tuning openclaw.json logging and debugging
configuration. Gated behind Power User Mode.

Covers:
- Log level / console level / console style selectors
- Redact sensitive toggle
- Enhanced logging feature toggles (tool errors, perf outliers, etc.)
- Performance threshold sliders (tool call, agent turn, gateway, db op)
- Token warning threshold sliders
- Tool journal config (enable, file path, retention, redaction)
- Suppress subsystem debug logs tag list
- Channel debug overrides (add/remove with verbose/debug/trace/suppress)
- Feature debug overrides (add/remove with verbose/debug/trace/suppress)
- Sticky save/reset bar with dirty state tracking

https://claude.ai/code/session_011WdpEacHmK1fMQMFiD3Szu

* fix: address data loss, UX gaps, and missing fields in debug/logging config

Fixes:
- Preserve ALL config fields on save (file, redactPatterns, journal.toolFilter,
  enhanced.gatewayHealthSuppressMethods) via index signature and full-object
  patching — previously saving clobbered unmodeled fields
- Fix dead ternary in enhanced logging defaults (both branches were `true`)
- Add proper error state when gateway/config fails to load
- Add beforeunload guard to prevent losing unsaved changes on navigation
- Token threshold cross-validation: prevent warning >= critical with inline
  error message and disabled save button
- Gate "Debug & Logging" nav item behind power user mode in both desktop
  and mobile navs (was visible to all users before)

New config fields exposed:
- logging.file (log file path)
- logging.redactPatterns (custom regex redaction patterns)
- logging.journal.toolFilter (scope journal to specific tools)
- logging.enhanced.gatewayHealthSuppressMethods (suppress health logs
  for specific RPC methods)

UX improvements:
- Channel autocomplete suggestions from useChannelsStatusFast() gateway data
- Feature autocomplete suggestions from known codebase feature IDs
- Extracted reusable TagListEditor component for string[] config fields
- Quick-add badge chips for one-click channel/feature addition

https://claude.ai/code/session_011WdpEacHmK1fMQMFiD3Szu

* tests: relax cron timer timezone expectation

* Fix journal toggle default and tool filter help text in DebugLoggingSection (openclaw#399)

- Default the journal enabled toggle to true (was false), matching the
  runtime behavior where startJournalSubscriber treats undefined as enabled
- Update tool filter help text to reflect actual backend default
  (DEFAULT_JOURNAL_TOOLS subset) instead of claiming "all tools"
- Expand journal sub-settings when enabled field is unset (consistent
  with the new default-true toggle)

https://claude.ai/code/session_011jGYfDDmG4hSUMkct6YsjR

Co-authored-by: Claude <[email protected]>

* feat(browser): persist Playwright storageState across context resets

When the CDP connection drops and a new browser context is created,
cookies and localStorage were lost because browser.newContext() starts
fresh. This adds storageState persistence so auth sessions survive
reconnections:

- Save/restore storageState (cookies + localStorage) to a JSON file
  inside each profile's user-data directory
- Auto-save storageState on browser disconnect (best-effort)
- Load saved storageState when creating a new context (fallback path)
- New HTTP endpoints: POST /storage-state/save and /storage-state/restore
- Register storageState path per profile on ensureBrowserAvailable

https://claude.ai/code/session_01FXjaQLR6ZDroPgPiK2TrL3

* feat(browser): import cookies from user's real Chrome profile

Adds the ability to import cookies from the user's installed Chrome,
Chromium, or Brave browser into the Playwright-managed browser context.
This lets you reuse existing web logins (ChatGPT, GitHub, etc.) without
re-authenticating, proving out the value of cookie persistence.

Implementation:
- chrome-cookie-import.ts: reads Chrome's SQLite cookie DB via node:sqlite,
  decrypts v10/v11 cookies on Linux (PBKDF2 "peanuts") and macOS (Keychain),
  filters by domain, skips expired cookies
- GET /chrome-profiles: discover installed Chrome profiles
- POST /import-chrome-cookies: import cookies into current Playwright context
  with optional domain filtering (e.g. ["chatgpt.com", "openai.com"])

Example usage:
  POST /import-chrome-cookies
  { "domains": ["chatgpt.com", "auth0.com", "openai.com"] }

https://claude.ai/code/session_01FXjaQLR6ZDroPgPiK2TrL3

---------

Co-authored-by: Claude <[email protected]>
* feat(telegram): add TelegramRichMessage MCP tool + response store

- TelegramRichMessage tool: renders semantic patterns to Telegram HTML + InlineKeyboardMarkup
- Supports all 7 patterns: multiple_choice, confirmation, task_proposal, action_items, status, progress, info_grid
- TelegramResponseStore: tracks pending interactive requests with timeout handling
- 11 tests passing for rich message tool
- Response store for shared use by all interactive tools

* feat(telegram): add AskTelegramConfirmation + AskTelegramQuestion interactive tools

- AskTelegramConfirmation: Confirm/Cancel inline buttons, blocks until response
  - Custom labels, primary/danger style, message update after response
  - 9 tests passing
- AskTelegramQuestion: Single-choice and multi-choice inline keyboard
  - Multi-choice with toggle mode and Done button
  - Message update to show selected answer
  - 8 tests passing
- Both tools use callback router + response store integration

* feat(telegram): add AskTelegramForm conversational multi-step form tool
…error handling

Phase 3: Config & Wiring
- Add NotionConfig types to src/config/types.notion.ts
  - NotionWebhookConfig: webhook.enabled, webhook.secret, webhook.path
  - NotionToolsConfig: tools.enabled, tools.apiKey
  - NotionConfig: botId, webhook, tools
- Add notion field to OpenClawConfig
- Create src/gateway/notion-wiring.ts — gateway integration module:
  - resolveNotionConfig(): Reads config + env vars (NOTION_API_KEY,
    NOTION_WEBHOOK_SECRET, NOTION_BOT_ID) with fallbacks
  - setupNotionWebhook(): Registers /webhooks/notion HTTP route via
    plugin registry with event router for memory ingest / session wake
  - setupNotionTools(): Creates 7 Notion agent tools
  - setupNotion(): One-call combined setup for gateway startup
- Auto-enable: webhook enables when secret exists, tools enable when
  API key exists

Fix: Tool error handling
- Wrap all 7 tool execute functions in try/catch at the top level so
  readStringParam throws (required params) are caught and returned as
  jsonResult({ error }) instead of propagating as uncaught exceptions

Docs: NOTION-BIDIRECTIONAL-WEBHOOK-SETUP.md
- Complete setup guide covering integration creation, config, env vars,
  webhook subscription, architecture, event types, security, and
  troubleshooting

Tests: 65 tests passing (17 new wiring tests + 48 existing)
- Add audit log toggle button in Overseer header actions
- Wire renderAuditLog component into overseer.ts with proper props
- Add OverseerProps: auditLogState, showAuditLog, filter/expand handlers
- Add comprehensive CSS for audit log: timeline, filters, badges, events
- Responsive design for mobile with light theme support
- Event timeline with color-coded dots, badges, expandable JSON data
- Time range, event type, goal, and search filters
Both files had uncommitted debug log statements referencing 'log'
without importing createSubsystemLogger. This broke the DTS build
(build:plugin-sdk:dts step).
…openclaw#407)

- Created shared utility ui/src/ui/utils/optimistic.ts with:
  - optimistic() helper for apply/rollback/mutate/refresh pattern
  - snapshot() helper for shallow state cloning
  - Automatic error toast on API failure via existing toast system

- Sessions controller (ui/src/ui/controllers/sessions.ts):
  - deleteSession: immediately removes session from list, rollback on error
  - abortSession: immediately shows abortedLastRun=true state
  - abortAllSessions: marks all active sessions as aborting
  - abortSessionsForAgent: marks agent sessions as aborting
  - All operations rollback to snapshot on API error with toast

- Cron controller (ui/src/ui/controllers/cron.ts):
  - toggleCronJob: immediately toggles enabled state in UI
  - removeCronJob: immediately removes job from list and clears runs
  - Both rollback to snapshot on API error with toast

- Updated BACKLOG.md to mark task complete

Closes P3 backlog item: Implement optimistic UI updates
openclaw#408)

Apply the optimistic UI update pattern (from optimistic.ts utility) to
the automations and skills controllers. Actions like toggle-suspend,
delete, enable/disable now provide instant visual feedback with
automatic rollback on API failure.
- Add CronDeliveryDefaults type for global delivery settings
- Add normalizeMode() and normalizeDefaultDelivery() helper functions
- Thread defaults through resolveCronDeliveryPlan()
- Add defaultDelivery config option to cron zod schema
- Handle legacy deliver:off mode correctly (return mode:'none')
- Support fallback chain: job delivery > payload > defaults > 'last'
- Fix cron timer to pass defaults to delivery plan resolution
- 9 tests passing (delivery, service delivery-plan, config defaults)
@dgarson
Copy link
Owner Author

dgarson commented Feb 9, 2026

Already merged as PR openclaw#417 on main. Closing duplicate.

@dgarson dgarson closed this Feb 9, 2026
@dgarson dgarson deleted the autodev-cron-delivery-defaults branch February 9, 2026 16:00
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.

2 participants