fix: infer --auth-choice from API key flags during non-interactive onboarding#9241
Merged
gumadeiras merged 3 commits intomainfrom Feb 5, 2026
Merged
fix: infer --auth-choice from API key flags during non-interactive onboarding#9241gumadeiras merged 3 commits intomainfrom
gumadeiras merged 3 commits intomainfrom
Conversation
…boarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes #8481
Member
Author
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes a bug where API keys passed via flags during non-interactive onboarding (e.g., --anthropic-api-key) were being silently dropped when --auth-choice was not explicitly provided. The fix introduces logic to infer the appropriate AuthChoice from the provider API key flags and adds validation to prevent multiple conflicting flags from being used simultaneously.
Changes:
- Adds
inferAuthChoiceFromFlags()helper that maps provider API key flags to their correspondingAuthChoicevalues - Updates non-interactive onboarding to use the inferred auth choice when
--auth-choiceis not explicitly provided - Adds validation to reject multiple API key flags in non-interactive mode
- Adds test coverage for Cloudflare AI Gateway auth choice inference
- Updates changelog with credit to the original reporter
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| src/commands/onboard-non-interactive/local/auth-choice-inference.ts | New file containing flag-to-auth-choice mapping and inference logic |
| src/commands/onboard-non-interactive/local.ts | Integrates inference logic and adds multi-flag validation before applying auth choice |
| src/commands/onboard-non-interactive.cloudflare-ai-gateway.test.ts | Adds test case verifying auth choice is correctly inferred from cloudflareAiGatewayApiKey flag |
| CHANGELOG.md | Adds entry crediting the bug fix and original contributor |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
subsubl
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 5, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
psytz123
pushed a commit
to psytz123/openclaw
that referenced
this pull request
Feb 5, 2026
## Security Updates Incorporated (283 commits) ### Critical Security Fixes: 1. **Security: owner-only tools + command auth hardening** (openclaw#9202) 2. **Security: harden sandboxed media handling** (openclaw#9182) 3. **Security: Prevent gateway credential exfiltration via URL override** (openclaw#9179) 4. **fix: infer --auth-choice from API key flags during non-interactive onboarding** (openclaw#9241) 5. **fix: enforce owner allowlist for commands** 6. **Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching** (openclaw#9077) 7. **fix(imessage): detect self-chat echoes to prevent infinite loops** (openclaw#8680) 8. **fix(imessage): unify timeout configuration with configurable probeTimeoutMs** 9. **security(web): sanitize WhatsApp accountId to prevent path traversal** (openclaw#4610) 10. **fix: harden whatsapp command auth** ### WhatsApp Security Enhancements: - WhatsApp login guard security improvements - LID mention detection hardening - Contact cards security fixes - Ack reaction logic improvements - Media max size configurable limits - Group allowlist normalization ### Authentication & Authorization: - Owner allowlist enforcement - Command auth hardening - API key flag inference - Gateway credential protection - Sandboxed media handling security ### Channel-Specific Security: - **Telegram**: Sticker caching hardening, forward metadata fixes - **iMessage**: Echo loop prevention, timeout configuration - **Signal**: Typing receipt security - **Slack**: Media download security - **Matrix**: Room security improvements ### New Features with Security: - **Feishu channel support** (new secure channel) - **Per-channel responsePrefix override** - **Cloudflare AI Gateway provider** - **Discord presence monitoring** - **Enhanced cron delivery security** ## Dashboard v2.0 Preserved: - ✅ Kanban CRUD operations (create/update/delete) - ✅ Swarm agent management (spawn/kill/view output) - ✅ 3 new autonomy tabs (nightworker, selfimprove, proactive) - ✅ Server-side RPC handlers for new features - ✅ CSS architecture for autonomy system - ✅ Complete dashboard audit with persistence ## Merge Strategy: - **Kept OURS**: Dashboard UI files (app-render.ts, app-settings.ts, app.ts, navigation.ts, etc.) - **Took THEIRS**: Security fixes in core files (pi-tool-definition-adapter.ts) - **Resolved conflicts**: Prioritized security updates where no dashboard functionality impacted ## Version: v2026.2.3-security-dashboard-v2 - Base: Upstream v2026.2.3 - Enhanced: Dashboard v2.0 autonomy system - Security: All critical upstream security patches
CompassHXM
added a commit
to CompassHXM/clawdbot
that referenced
this pull request
Feb 5, 2026
* docs: note docker allow-unconfigured behavior
* fix: start gateway in docker CMD (#6635) (thanks @kaizen403)
* test: cover SSRF blocking for attachment URLs
* fix: polish docker setup flow
* chore: We have a sleep at home. The sleep at home:
* fix(update): harden global updates
* chore: fix broken test.
* fix: expand SSRF guard coverage
* fix: stabilize docker e2e flows
* fix(telegram): handle Grammy HttpError network failures (#3815) (#7195)
* fix(telegram): handle Grammy HttpError network failures (#3815)
Grammy wraps fetch errors in an .error property (not .cause). Added .error
traversal to collectErrorCandidates in network-errors.ts.
Registered scoped unhandled rejection handler in monitorTelegramProvider
to catch network errors that escape the polling loop (e.g., from setMyCommands
during bot setup). Handler is unregistered when the provider stops.
* fix(telegram): address review feedback for Grammy HttpError handling
- Gate .error traversal on HttpError name to avoid widening search graph
- Use runtime logger instead of console.warn for consistency
- Add isGrammyHttpError check to scope unhandled rejection handler
- Consolidate isNetworkRelatedError into isRecoverableTelegramNetworkError
- Add 'timeout' to recoverable message snippets for full coverage
* CI: label maintainer issues
* Docs i18n: harden doc-mode pipeline
* Docs: add zh-CN translations
* Docs: fix zh-CN template time wording
What: replace <2/<30 text in zh-CN AGENTS template with safe wording
Why: avoid MDX parse errors during docs build
Tests: not run (doc text change)
* docs: add changelog for zh-CN translations (#6619) (thanks @joshp123)
* Docs: fix zh-CN ClawHub link
What: wrap clawhub.com in an explicit URL link in zh-CN skills doc
Why: avoid Mintlify broken-link parser treating trailing punctuation as part of the URL
Tests: not run (doc text change)
* Docs: use explicit ClawHub markdown link
What: switch clawhub.com reference to explicit Markdown link syntax
Why: MDX parser rejects angle-bracket autolinks
Tests: not run (doc text change)
* Docs i18n: tune zh-CN prompt + glossary
What: enforce zh-CN tone (你/你的), Skills/local loopback/Tailscale terms, Gateway网关
Why: keep future translation output consistent with issue feedback
Tests: not run (prompt/glossary change)
* Docs: normalize zh-CN terminology + tone
What: switch to 你/你的 tone; standardize Skills/Gateway网关/local loopback/私信 wording
Why: align zh-CN docs with issue 6995 feedback + idiomatic tech style
Tests: pnpm docs:build
* Tests: stub SSRF DNS pinning (#6619) (thanks @joshp123)
* fix(webchat): respect user scroll position during streaming and refresh
- Increase near-bottom threshold from 200px to 450px so one long message
doesn't falsely register as 'near bottom'
- Make force=true only override on initial load (chatHasAutoScrolled=false),
not on subsequent refreshChat() calls
- refreshChat() no longer passes force=true to scheduleChatScroll
- Add chatNewMessagesBelow flag for future 'scroll to bottom' button UI
- Clear chatNewMessagesBelow when user scrolls back to bottom
- Add 13 unit tests covering threshold, force behavior, streaming, and reset
* fix: address review feedback — retryDelay uses effectiveForce, default overrides param, @state() on chatNewMessagesBelow
* Docs: expand zh-Hans nav and fix assets
* Docs: expand zh-Hans nav (#7242) (thanks @joshp123)
* fix(ui): add core state and logic for scroll control
* feat(ui): add new messages indicator button
* docs: update changelog for PR #7226
* chore: fix formatting and CI
* iOS: wire node services and tests
* iOS: stabilize talk mode tests
* Gateway: fix node invoke receive loop
* Gateway: wait for snapshot before connect
* Agents: add nodes invoke action
* iOS: fix node notify and identity
* iOS: streamline notify timeouts
* iOS: add write commands for contacts/calendar/reminders
* iOS: add push-to-talk node commands
* iOS: pause voice wake during PTT
* iOS: add PTT once/cancel
* Gateway: add PTT chat + nodes CLI
* iOS: wire node commands and incremental TTS
* iOS: update onboarding and gateway UI
* Core: update shared gateway models
* iOS: improve gateway auto-connect and voice permissions
* Docs: add zh-CN landing notice + AI image
* Docs: add zh-CN landing note (#7303) (thanks @joshp123)
* Docs: expand zh-CN landing note
* Revert "iOS: wire node services and tests"
This reverts commit 7b0a0f3dace575c33dafb61d4a13cdef4dd0d64e.
* Revert "Core: update shared gateway models"
This reverts commit 37eaca719a68aa1ad9dcbfe83c8a20e88bb6951a.
* fix: resolve check errors in nodes-tool and commands-ptt
* feat(config): default thinking for sessions_spawn subagents (#7372)
* feat(config): add subagent default thinking
* fix: accept config subagents.thinking + stabilize test mocks (#7372) (thanks @tyler6204)
* fix: use findLast instead of clearAllMocks in test (#7372)
* fix: correct test assertions for tool result structure (#7372)
* fix: remove unnecessary type assertion after rebase
* fix: validate AbortSignal instances before calling AbortSignal.any()
Fixes #7269
* refactor: use structural typing instead of instanceof for AbortSignal check
Address P1 review feedback from Greptile: instanceof AbortSignal may be
unreliable across different realms (VM, iframe, etc.) where the AbortSignal
constructor may differ. Use structural typing (checking for aborted property
and addEventListener method) for more robust cross-realm compatibility.
* fix: validate AbortSignal instances before calling AbortSignal.any() (#7277) (thanks @Elarwei001)
* fix(tools): ensure file_path alias passes validation in read/write tools (#7451)
Co-authored-by: lotusfall <lotusfall@outlook.com>
* fix: skip audio files from text extraction to prevent binary processing (#7475)
* fix: skip audio files from text extraction early
Audio files should not be processed through extractFileBlocks for text
extraction - they are handled by the dedicated audio transcription
capability (STT).
Previously, audio files were only skipped if they didn't "look like text"
(looksLikeUtf8Text check). This caused issues where some audio binary
data (e.g., long Telegram voice messages) could accidentally pass the
heuristic check and get processed as text content.
This fix:
1. Adds audio to the early skip alongside image/video (more efficient)
2. Removes the redundant secondary check that had the flawed condition
Fixes audio binary being incorrectly processed as text in Telegram and
other platforms.
* Media: skip binary media in file extraction (#7475) (thanks @AlexZhangji)
---------
Co-authored-by: Shakker <shakkerdroid@gmail.com>
* fix(telegram): recover from grammY "timed out" long-poll errors (#7239)
grammY getUpdates returns "Request to getUpdates timed out after 500 seconds"
but RECOVERABLE_MESSAGE_SNIPPETS only had "timeout". Since
"timed out".includes("timeout") === false, the error was not classified as
recoverable, causing the polling loop to exit permanently.
Add "timed out" to RECOVERABLE_MESSAGE_SNIPPETS so the polling loop retries
instead of dying silently.
Fixes #7239
Fixes #7255
* fix(telegram): recover from grammY long-poll timeouts (#7466) (thanks @macmimi23)
* Docs: fix compatibility shim note
* Agent: repair malformed tool calls and session files
* Changelog: note tool call repair
* Agents: fix lint in tool-call sanitizers
* Agents: harden session file repair
* Agents: flush pending tool results on drop
* Docs: simplify transcript hygiene scope
* fix: repair malformed tool calls and session transcripts (#7473) (thanks @justinhuangcode)
* chore: Update deps.
* fix(slack): fail closed on slash command channel type lookup
* fix: harden exec allowlist parsing
* fix(gateway): require shared auth before device bypass
* style(ui): format resizable divider
* chore: Fix CI.
* Docs: clarify whats new FAQ heading (#7394)
* feat(ui): add Agents dashboard
* Security: new openclaw-system-admin skill + bootstrap audit
* Security: rename openclaw-system-admin skill to healthcheck
* Security: remove openclaw-system-admin skill path
* Security: refine healthcheck workflow
* Security: healthcheck skill (#7641) (thanks @Takhoffman)
* chore: fix CI
* chore: fix formatting
* Security: tune bootstrap healthcheck prompt + healthcheck wording
* chore: fix formatting
* CLI: restore terminal state on exit
* Onboarding: keep TUI flow exclusive
* fix: error handling in restore failure reporting
* feat (memory): Implement new (opt-in) QMD memory backend
* Make memory more resilient to failure
* Add more tests; make fall back more resilient and visible
* Fix build errors
* fix(qmd): use XDG dirs for qmd home; drop ollama docs
* fix(memory-qmd): write XDG index.yml + legacy compat
* fix(memory-qmd): create collections via qmd CLI (no YAML)
* Add how to trigger model downloads for qmd in documentation
* fix(memory/qmd): throttle embed + citations auto + restore --force
* Tests: use OPENCLAW_STATE_DIR in qmd manager
* Docs: align QMD state dir with OpenClaw
* Memory: parse quoted qmd command
* Memory: fix QMD scope channel parsing
* Memory: harden QMD memory_get path checks
* Memory: clamp QMD citations to injected budget
* Tests: cover QMD scope, reads, and citation clamp
* QMD: use OpenClaw config types
* Fix build regressions after merge
* Lint: add braces for single-line ifs
* fix: make QMD cache key deterministic
* fix: derive citations chat type via session parser
* chore: apply formatter
* chore: restore OpenClaw branding
* chore: fix lint warnings
* chore: oxfmt
* fix: restore session_status and CLI examples
* chore: oxfmt
* fix: restore safety + session_status hints
* chore: oxfmt
* fix: changelog entry for QMD memory (#3160) (thanks @vignesh07)
* docs: finish renaming memory state dir references
* CLI: cache shell completion scripts
* Install: cache completion scripts on install/update
* Onboarding: drop completion prompt
* chore: update changelog for completion caching
* chore: Migrate to tsdown, speed up JS bundling by ~10x (thanks @hyf0).
The previous migration to tsdown was reverted because it caused a ~20x slowdown when running OpenClaw from the repo. @hyf0 investigated and found that simply renaming the `dist` folder also caused the same slowdown. It turns out the Plugin script loader has a bunch of voodoo vibe logic to determine if it should load files from source and compile them, or if it should load them from dist. When building with tsdown, the filesystem layout is different (bundled), and so some files weren't in the right location, and the Plugin script loader decided to compile source files from scratch using Jiti.
The new implementation uses tsdown to embed `NODE_ENV: 'production'`, which we now use to determine if we are running OpenClaw from a "production environmen" (ie. from dist). This removes the slop in favor of a deterministic toggle, and doesn't rely on directory names or similar.
There is some code reaching into `dist` to load specific modules, primarily in the voice-call extension, which I simplified into loading an "officially" exported `extensionAPI.js` file. With tsdown, entry points need to be explicitly configured, so we should be able to avoid sloppy code reaching into internals from now on. This might break some existing users, but if it does, it's because they were using "private" APIs.
* fix: CI: We no longer need to test the tsc build with Bun, we are always using `tsdown` to build now.
* fix: Remove `tsconfig.oxlint.json` AGAIN.
* feat: remove slop.
* chore: clean up git hooks and actually install them again.
* fix: Fix Mac app build step.
* chore: Fix all TypeScript errors in `ui`.
* chore: Switch to `NodeNext` for `module`/`moduleResolution` in `ui`.
* chore: Merge tsconfigs, typecheck `ui` as part of `pnpm tsgo` locally and on CI.
* Skills: refine healthcheck guidance
* fix(voice-call): harden inbound policy
* fix(matrix): harden allowlists
* fix: harden Windows exec allowlist
* docs: Update information architecture for OpenClaw docs (#7622)
* docs: restructure navigation into 5 tabs for better IA
* dedupe redirects
* use 8 tabs
* add missing /index extensions
* update zh navigation
* remove `default: true` and rearrange languages
* add missing redirects
* format:fix
* docs: update IA tabs + restore /images redirect (#7622) (thanks @ethanpalm)
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix: restore OpenClaw docs/source links in system prompt
* chore: prepare 2026.2.2 release
* fix(ui): fix web UI after tsdown migration and typing changes
* fix(skills): warn when bundled dir missing
* fix(ui): refresh agent files after external edits
* fix(ui): note agent file refresh in changelog
* Docs: refresh zh-CN translations + i18n guidance
What:
- update zh-CN glossary, translation prompt, and TM
- regenerate zh-CN docs and apply targeted fixes
- add zh-CN AGENTS guidance for translation pipeline
Why:
- address zh-CN terminology and spacing feedback from #6995
Tests:
- pnpm build && pnpm check && pnpm test
* Docs: update zh-CN translations and pipeline
What:
- update zh-CN glossary, TM, and translator prompt
- regenerate zh-CN docs and apply targeted fixes
- add zh-CN AGENTS pipeline guidance
Why:
- address terminology/spacing feedback from #6995
Tests:
- pnpm build && pnpm check && pnpm test
* Docs(zh-CN): add AGENTS translation workflow
* Channels: add Feishu/Lark support
* Channels: finish Feishu/Lark integration
* fix: harden control ui framing + ws origin
* fix(approvals): gate /approve by gateway scopes
* test: add /approve gateway scope coverage (#1) (thanks @mitsuhiko)
* test: reset /approve mock per test (#1) (thanks @mitsuhiko)
* chore: prep 2026.2.2 docs/release checks
* chore: update appcast for 2026.2.2
* chore: add mac dSYM zip to release artifacts
* fix: use build-info for version fallback
* Docs: guard zh-CN i18n workflow
What:
- document zh-CN docs pipeline and generated-doc guardrails
- note Discord escalation when the pipeline drags
Why:
- prevent accidental edits to generated translations
Tests:
- pnpm build
- pnpm check
- pnpm test
Co-authored-by: Josh Palmer <joshpalmer123@gmail.com>
* chore: bump version to 2026.2.2-1
* fix: improve build-info resolution for commit/version
* Docs: drop healthcheck from bootstrap
* fix(update): honor update.channel for update.run
* fix: enforce Nextcloud Talk allowlist by user id
* feat: add configurable web_fetch maxChars cap
* fix(matrix): require unique allowlist matches in wizard
* fix: add legacy daemon-cli shim for updates
* iMessage: promote BlueBubbles and refresh docs/skills (#8415)
* feat: Make BlueBubbles the primary iMessage integration
- Remove old imsg skill (skills/imsg/SKILL.md)
- Create new BlueBubbles skill (skills/bluebubbles/SKILL.md) with message tool examples
- Add keep-alive script documentation for VM/headless setups to docs/channels/bluebubbles.md
- AppleScript that pokes Messages.app every 5 minutes
- LaunchAgent configuration for automatic execution
- Prevents Messages.app from going idle in VM environments
- Update all documentation to prioritize BlueBubbles over legacy imsg:
- Mark imsg channel as legacy throughout docs
- Update README.md channel lists
- Update wizard, hubs, pairing, and index docs
- Update FAQ to recommend BlueBubbles for iMessage
- Update RPC docs to note imsg as legacy pattern
- Update Chinese documentation (zh-CN)
- Replace imsg examples with generic macOS skill examples where appropriate
BlueBubbles is now the recommended first-class iMessage integration,
with the legacy imsg integration marked for potential future removal.
* refactor: Update import paths and improve code formatting
- Adjusted import paths in session-status-tool.ts, whatsapp-heartbeat.ts, and heartbeat-runner.ts for consistency.
- Reformatted code for better readability by aligning and grouping related imports and function parameters.
- Enhanced error messages and conditional checks for clarity in heartbeat-runner.ts.
* skills: restore imsg skill and align bluebubbles skill
* docs: update FAQ for clarity and formatting
- Adjusted the formatting of the FAQ section to ensure consistent bullet point alignment.
- No content changes were made, only formatting improvements for better readability.
* style: oxfmt touched files
* fix: preserve BlueBubbles developer reference (#8415) (thanks @tyler6204)
* refactor: remove unnecessary blank line in policy test file
* chore: bump version to 2026.2.3
* feat: add new messages indicator style for chat interface
- Introduced a floating pill element above the compose area to indicate new messages.
- Styled the indicator with hover effects and responsive design for better user interaction.
* Telegram: add inline button model selection for /models and /model commands
* Telegram: fix model button review issues
- Add currentModel to callback handler for checkmark display
- Add 64-byte callback_data limit protection (skip long model IDs)
- Add tests for large model lists and callback_data limits
* fix: honor telegram model overrides in buttons (#8193) (thanks @gildo)
* chore: update changelog for #8193 (thanks @gildo)
* feat(discord): add set-presence action for bot activity and status
Bridge the agent tools layer to the Discord gateway WebSocket via a new
gateway registry, allowing agents to set the bot's activity and online
status. Supports playing, streaming, listening, watching, custom, and
competing activity types. Custom type uses activityState as the sidebar
text; other types show activityName in the sidebar and activityState in
the flyout. Opt-in via channels.discord.actions.presence (default false).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Address PR feedback
* Make openclaw consistent in this file (#8533)
Co-authored-by: stephenchen2025 <schenjobs@gmail.com>
* style: update chat new-messages button
* feat: add support for Moonshot API key for China endpoint
* fix: keep Moonshot CN base URL in onboarding (#7180) (thanks @waynelwz)
* docs(skills): split tmux send-keys for TUI (#7737)
* docs(skills): split tmux send-keys for TUI
* docs(skills): soften TUI send-keys wording
---------
Co-authored-by: wangnov <1694546283@qq.com>
* docs: note tmux send-keys TUI guidance (#7737) (thanks @Wangnov)
* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set (#7178)
* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set
* refactor(control-ui): header logo under basePath; normalize logo URL with normalizeBasePath
* docs: add changelog for #7178 (thanks @Yeom-JinHo)
* docs: document secure DM mode preset (#7872)
* docs: document secure DM mode preset
* fix: resolve merge conflict in resizable-divider
* fix(security): separate untrusted channel metadata from system prompt (thanks @KonstantinMirin)
* docs: update Feishu plugin docs
* feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)
* feat: add docs chat prototype and related scripts
- Introduced a minimal documentation chatbot that builds a search index from markdown files and serves responses via an API.
- Added scripts for building the index and serving the chat API.
- Updated package.json with new commands for chat index building and serving.
- Created a new Vercel configuration file for deployment.
- Added a README for the docs chat prototype detailing usage and integration.
* feat: enhance docs chat with vector-based RAG pipeline
- Added vector index building and serving capabilities to the docs chat.
- Introduced new scripts for generating embeddings and serving the chat API using vector search.
- Updated package.json with new commands for vector index operations.
- Enhanced README with instructions for the new RAG pipeline and legacy keyword pipeline.
- Removed outdated Vercel configuration file.
* feat: enhance chat widget with markdown rendering and style updates
- Integrated dynamic loading of markdown rendering for chat responses.
- Implemented a fallback for markdown rendering to ensure consistent display.
- Updated CSS variables for improved theming and visual consistency.
- Enhanced chat bubble and input styles for better user experience.
- Added new styles for markdown content in chat bubbles, including code blocks and lists.
* feat: add copy buttons to chat widget for enhanced user interaction
- Implemented copy buttons for chat responses and code blocks in the chat widget.
- Updated CSS styles for improved visibility and interaction of copy buttons.
- Adjusted textarea height for better user experience.
- Enhanced functionality to allow users to easily copy text from chat bubbles and code snippets.
* feat: update chat widget styles for improved user experience
- Changed accent color for better visibility.
- Enhanced preformatted text styles for code blocks, including padding and word wrapping.
- Adjusted positioning and styles of copy buttons for chat responses and code snippets.
- Improved hover effects for copy buttons to enhance interactivity.
* feat: enhance chat widget styles for better responsiveness and scrollbar design
- Updated chat panel dimensions for improved adaptability on various screen sizes.
- Added custom scrollbar styles for better aesthetics and usability.
- Adjusted chat bubble styles for enhanced visibility and interaction.
- Improved layout for expanded chat widget on smaller screens.
* feat: refine chat widget code block styles and copy button functionality
- Adjusted padding and margin for preformatted text in chat responses for better visual consistency.
- Introduced a compact style for single-line code blocks to enhance layout.
- Updated copy button logic to skip short code blocks, improving user experience when copying code snippets.
* feat: add resize handle functionality to chat widget for adjustable panel width
- Implemented a draggable resize handle for the chat widget's sidebar, allowing users to adjust the panel width.
- Added CSS styles for the resize handle, including hover effects and responsive behavior.
- Integrated drag-to-resize logic to maintain user-set width across interactions.
- Ensured the panel resets to default width when closed, enhancing user experience.
* feat: implement rate limiting and error handling in chat API
- Added rate limiting functionality to the chat API, allowing a maximum number of requests per IP within a specified time window.
- Implemented error handling for rate limit exceeded responses, including appropriate headers and retry instructions.
- Enhanced error handling for other API errors, providing user-friendly messages for various failure scenarios.
- Updated README to include new environment variables for rate limiting configuration.
* feat: integrate Upstash Vector for enhanced document retrieval in chat API
- Implemented Upstash Vector as a cloud-based storage solution for document chunks, replacing the local LanceDB option.
- Added auto-detection of storage mode based on environment variables for seamless integration.
- Updated the chat API to utilize the new retrieval mechanism, enhancing response accuracy and performance.
- Enhanced README with setup instructions for Upstash and updated environment variable requirements.
- Introduced new scripts and configurations for managing the vector index and API interactions.
* feat: add create-markdown-preview.js for markdown rendering
- Introduced a new script for framework-agnostic HTML rendering of markdown content.
- The script includes various parsing functions to handle different markdown elements.
- Updated the chat widget to load the vendored version of @create-markdown/preview for improved markdown rendering.
* docs: update README for Upstash Vector index setup and environment variables
- Enhanced instructions for creating a Vector index in Upstash, including detailed settings and important notes.
- Clarified environment variable requirements for both Upstash and LanceDB modes.
- Improved formatting and organization of setup steps for better readability.
- Added health check and API endpoint details for clearer usage guidance.
* feat: add TRUST_PROXY environment variable for IP address handling
- Introduced the TRUST_PROXY variable to control the trust of X-Forwarded-For headers when behind a reverse proxy.
- Updated the README to document the new environment variable and its default value.
- Enhanced the getClientIP function to conditionally trust proxy headers based on the TRUST_PROXY setting.
* feat: add ALLOWED_ORIGINS environment variable for CORS configuration
- Introduced the ALLOWED_ORIGINS variable to specify allowed origins for CORS, enhancing security and flexibility.
- Updated the README to document the new environment variable and its usage.
- Refactored CORS handling in the server code to utilize the ALLOWED_ORIGINS setting for dynamic origin control.
* fix: ensure complete markdown rendering in chat widget
- Added logic to flush any remaining buffered bytes from the decoder, ensuring that all text is rendered correctly in the assistant bubble.
- Updated the assistant bubble's innerHTML to reflect the complete markdown content after streaming completes.
* feat: enhance DocsStore with improved vector handling and similarity conversion
- Added a constant for the distance metric used in vector searches, clarifying the assumption of L2 distance.
- Updated the createTable method to ensure all chunk properties are correctly mapped during table creation.
- Improved the similarity score calculation by providing a clear explanation of the conversion from L2 distance, ensuring accurate ranking of results.
* chore: fix code formatting
* Revert "chore: fix code formatting"
This reverts commit 6721f5b0b7bf60b76c519ccadfa41742f19ecf87.
* chore: format code for improved readability
- Reformatted code in serve.ts to enhance readability by adjusting indentation and line breaks.
- Ensured consistent style for function return types and object properties throughout the file.
* feat: Update API URL selection logic in chat widget
- Enhanced the API URL configuration to prioritize explicit settings, defaulting to localhost for development and using a production URL otherwise.
- Improved clarity in the code by adding comments to explain the logic behind the API URL selection.
* chore: Update documentation structure for improved organization
- Changed the path for the "Start Here" page to "start/index" for better clarity.
- Reformatted the "Web & Interfaces" and "Help" groups to use multi-line arrays for improved readability.
* feat: Enhance markdown preview integration and improve chat widget asset loading
- Wrapped the markdown preview functionality in an IIFE to expose a global API for easier integration.
- Updated the chat widget to load the markdown preview library dynamically, checking for existing instances to avoid duplicate loads.
- Adjusted asset paths in the chat widget to ensure correct loading based on the environment (local or production).
- Added CORS headers in the Vercel configuration for improved API accessibility.
* fix: Update chat API URL to include '/api' for correct endpoint access
- Modified the chat configuration and widget files to append '/api' to the API URL, ensuring proper endpoint usage in production and local environments.
* refactor: Simplify docs-chat configuration and remove unused scripts
- Removed outdated scripts and configurations related to the docs-chat feature, including build and serve scripts, as well as the associated package.json and README files.
- Streamlined the API URL configuration in the chat widget for better clarity and maintainability.
- Updated the package.json to remove unnecessary scripts related to the now-deleted functionality.
* refactor: Update documentation structure for improved clarity
- Changed the path for the "Start Here" page from "start/index" to "index" to enhance navigation and organization within the documentation.
* chore: Remove unused dependencies from package.json and pnpm-lock.yaml
- Deleted `@lancedb/lancedb`, `@upstash/vector`, and `openai` from both package.json and pnpm-lock.yaml to streamline the project and reduce bloat.
* chore: Clean up .gitignore by removing obsolete entries
- Deleted unused entries related to the docs-chat vector database from .gitignore to maintain a cleaner configuration.
* chore: Remove deprecated chat configuration and markdown preview script
- Deleted the `create-markdown-preview.js` script and the `docs-chat-config.js` file to eliminate unused assets and streamline the project.
- Updated the `docs-chat-widget.js` to directly reference the markdown library from a CDN, enhancing maintainability.
* chore: Update markdown rendering in chat widget to use marked library
- Replaced the deprecated `create-markdown-preview` library with the `marked` library for markdown rendering.
- Adjusted the script loading mechanism to fetch `marked` from a CDN, improving performance and maintainability.
- Enhanced the markdown rendering function to ensure security by disabling HTML pass-through and opening links in new tabs.
* Delete docs/start/index.md
* fix: harden voice-call webhook verification
* fix(cron): fix timeout, add timestamp validation, enable file sync
Fixes #7667
Task 1: Fix cron operation timeouts
- Increase default gateway tool timeout from 10s to 30s
- Increase cron-specific tool timeout to 60s
- Increase CLI default timeout from 10s to 30s
- Prevents timeouts when gateway is busy with long-running jobs
Task 2: Add timestamp validation
- New validateScheduleTimestamp() function in validate-timestamp.ts
- Rejects atMs timestamps more than 1 minute in the past
- Rejects atMs timestamps more than 10 years in the future
- Applied to both cron.add and cron.update operations
- Provides helpful error messages with current time and offset
Task 3: Enable file sync for manual edits
- Track file modification time (storeFileMtimeMs) in CronServiceState
- Check file mtime in ensureLoaded() and reload if changed
- Recompute next runs after reload to maintain accuracy
- Update mtime after persist() to prevent reload loop
- Dashboard now picks up manual edits to ~/.openclaw/cron/jobs.json
* feat(cron): introduce delivery modes for isolated jobs
- Added support for new delivery modes in cron jobs: `announce`, `deliver`, and `none`.
- Updated documentation to reflect changes in delivery options and usage examples.
- Enhanced the cron job schema to include delivery configuration.
- Refactored related CLI commands and UI components to accommodate the new delivery settings.
- Improved handling of legacy delivery fields for backward compatibility.
This update allows users to choose how output from isolated jobs is delivered, enhancing flexibility in job management.
* feat(cron): default isolated jobs to announce delivery and enhance scheduling options
- Updated isolated cron jobs to default to `announce` delivery mode, improving user experience.
- Enhanced scheduling options to accept ISO 8601 timestamps for `schedule.at`, while still supporting epoch milliseconds.
- Refined documentation to clarify delivery modes and scheduling formats.
- Adjusted related CLI commands and UI components to reflect these changes, ensuring consistency across the platform.
- Improved handling of legacy delivery fields for backward compatibility.
This update streamlines the configuration of isolated jobs, making it easier for users to manage job outputs and schedules.
* feat(cron): enhance one-shot job behavior and CLI options
- Default one-shot jobs to delete after success, improving job management.
- Introduced `--keep-after-run` CLI option to allow users to retain one-shot jobs post-execution.
- Updated documentation to clarify default behaviors and new options for one-shot jobs.
- Adjusted cron job creation logic to ensure consistent handling of delete options.
- Enhanced tests to validate new behaviors and ensure reliability.
This update streamlines the handling of one-shot jobs, providing users with more control over job persistence and execution outcomes.
* feat(cron): enhance delivery modes and job configuration
- Updated isolated cron jobs to support new delivery modes: `announce` and `none`, improving output management.
- Refactored job configuration to remove legacy fields and streamline delivery settings.
- Enhanced the `CronJobEditor` UI to reflect changes in delivery options, including a new segmented control for delivery mode selection.
- Updated documentation to clarify the new delivery configurations and their implications for job execution.
- Improved tests to validate the new delivery behavior and ensure backward compatibility with legacy settings.
This update provides users with greater flexibility in managing how isolated jobs deliver their outputs, enhancing overall usability and clarity in job configurations.
* feat(cron): set default enabled state for cron jobs
- Added logic to default the `enabled` property to `true` if not explicitly set as a boolean in the cron job input.
- Updated job creation and store functions to ensure consistent handling of the `enabled` state across the application.
- Enhanced input normalization to improve job configuration reliability.
This update ensures that cron jobs are enabled by default, enhancing user experience and reducing potential misconfigurations.
* refactor(cron): update delivery instructions for isolated agent
- Revised the delivery instructions in the isolated agent's command body to clarify that summaries should be returned as plain text and will be delivered by the main agent.
- Removed the previous directive regarding messaging tools to streamline communication guidelines.
This change enhances clarity in the delivery process for isolated agent tasks.
* feat(cron): enhance delivery handling and testing for isolated jobs
- Introduced new properties for explicit message targeting and message tool disabling in the EmbeddedRunAttemptParams type.
- Updated cron job tests to validate best-effort delivery behavior and handling of delivery failures.
- Added logic to clear delivery settings when switching session targets in cron jobs.
- Improved the resolution of delivery failures and best-effort logic in the isolated agent's run function.
This update enhances the flexibility and reliability of delivery mechanisms in isolated cron jobs, ensuring better handling of message delivery scenarios.
* refactor(cron): improve delivery configuration handling in CronJobEditor and CLI
- Enhanced the delivery configuration logic in CronJobEditor to explicitly set the bestEffort property based on job settings.
- Refactored the CLI command to streamline delivery object creation, ensuring proper handling of optional fields like channel and to.
- Improved code readability and maintainability by restructuring delivery assignment logic.
This update clarifies the delivery configuration process, enhancing the reliability of job settings in both the editor and CLI.
* feat(cron): enhance legacy delivery handling in job patches
- Introduced logic to map legacy payload delivery updates onto the delivery object for `agentTurn` jobs, ensuring backward compatibility with legacy clients.
- Added tests to validate the correct application of legacy delivery settings in job patches, improving reliability in job configuration.
- Refactored delivery handling functions to streamline the merging of legacy delivery fields into the current job structure.
This update enhances the flexibility of delivery configurations, ensuring that legacy settings are properly handled in the context of new job patches.
* fix(cron): fix test failures and regenerate protocol files
- Add forceReload option to ensureLoaded to avoid stat I/O in normal
paths while still detecting cross-service writes in the timer path
- Post isolated job summary back to main session (restores the old
isolation.postToMainPrefix behavior via delivery model)
- Update legacy migration tests to check delivery.channel instead of
payload.channel (normalization now moves delivery fields to top-level)
- Remove legacy deliver/channel/to/bestEffortDeliver from payload schema
- Update protocol conformance test for delivery modes
- Regenerate GatewayModels.swift (isolation -> delivery)
* UI: handle future timestamps in formatAgo
* Changelog: move cron entries to 2026.2.3
* fix: cron announce delivery path (#8540) (thanks @tyler6204)
* Telegram: use Grammy types directly, add typed Probe/Audit to plugin interface (#8403)
* Telegram: replace duplicated types with Grammy imports, add Probe/Audit generics to plugin interface
* Telegram: remove legacy forward metadata (deprecated in Bot API 7.0), simplify required-field checks
* Telegram: clean up remaining legacy references and unnecessary casts
* Telegram: keep RequestInit parameter type in proxy fetch (addresses review feedback)
* Telegram: add exhaustiveness guard to resolveForwardOrigin switch
* fix(telegram): include forward_from_chat metadata in forwarded message context (#8133)
Extract missing metadata from forwarded Telegram messages:
- Add fromChatType to TelegramForwardedContext, capturing the original
chat type (channel/supergroup/group) from forward_from_chat.type
and forward_origin.chat/sender_chat.type
- Add fromMessageId to capture the original message ID from channel forwards
- Read author_signature from forward_origin objects (modern API),
preferring it over the deprecated forward_signature field
- Pass ForwardedFromChatType and ForwardedFromMessageId through to
the inbound context payload
- Add test coverage for forward_origin channel/chat types, including
author_signature extraction and fromChatType propagation
* fix: trim legacy signature fallback, type fromChatType as union
* fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg)
* fix(imessage): unify timeout configuration with configurable probeTimeoutMs
- Add probeTimeoutMs config option to channels.imessage
- Export DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS constant (10s) from probe.ts
- Propagate timeout config through all iMessage probe/RPC operations
- Fix hardcoded 2000ms timeouts that were too short for SSH connections
Closes: timeout issues when using SSH wrapper scripts (imsg-ssh)
* fix: address review comments
- Use optional timeoutMs parameter (undefined = use config/default)
- Extract DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS to shared constants.ts
- Import constant in client.ts instead of hardcoding
- Re-export constant from probe.ts for backwards compatibility
* fix(imessage): detect self-chat echoes to prevent infinite loops (#8680)
* fix: align proxy fetch typing
* feat: add cloudflare ai gateway provider
* fix: force reload cron store
* Revert "feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)" (#8834)
This reverts commit fa4b28d7af7464b07271bfef6c028e4135548f44.
* fix(web ui): agent model selection
* Docs: landing page revamp (#8885)
* Docs: refresh landing page
* Docs: add landing page companion pages
* Docs: drop legacy Jekyll assets
* Docs: remove legacy terminal css test
* Docs: restore terminal css assets
* Docs: remove terminal css assets
* fix(app-render): handle optional model in renderApp function
* chore: replace landpr prompt with end-to-end landing workflow (#8916)
* 🤖 docs: mirror landing revamp for zh-CN
What:
- add zh-CN versions of landing revamp pages (features, quickstart, docs directory, network model, credits)
- refresh zh-CN index and hubs, plus glossary entries
Why:
- keep Chinese docs aligned with the new English landing experience
- ensure navigation surfaces the new entry points
Tests:
- pnpm build && pnpm check && pnpm test
* 🤖 docs: note zh-CN landing revamp (#8994) (thanks @joshp123)
What:
- add changelog entry for the zh-CN landing revamp docs
Why:
- record the doc update and thank the contributor
Tests:
- pnpm lint && pnpm build && pnpm test
* feat: add shell completion installation prompt to CLI update command
* feat: add shell completion test script for installation verification
* completion: export cache utilities and require cached file for installation
- Export `resolveCompletionCachePath` and `completionCacheExists` for external use
- Update `installCompletion` to require cache existence (never use slow dynamic pattern)
- Add `usesSlowDynamicCompletion` to detect old `source <(...)` patterns
- Add `getShellProfilePath` helper for consistent profile path resolution
- Update `formatCompletionSourceLine` to always use cached file
* doctor: add shell completion check module
- Add `checkShellCompletionStatus` to get profile/cache/slow-pattern status
- Add `ensureCompletionCacheExists` for silent cache regeneration
- Add `doctorShellCompletion` to check and fix completion issues:
- Auto-upgrade old slow dynamic patterns to cached version
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* doctor: integrate shell completion check into doctor command
- Import and call `doctorShellCompletion` during doctor run
- Checks/fixes completion issues before gateway health check
* update: use shared completion helpers for shell completion setup
- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during update
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* onboard: use shared completion helpers for shell completion setup
- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during onboarding
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* scripts: update test-shell-completion to use shared helpers
- Use `checkShellCompletionStatus` and `ensureCompletionCacheExists` from doctor-completion
- Display "Uses slow pattern" status in output
- Simulate doctor/update/onboard behavior for all completion scenarios
- Remove duplicated utility functions
* changelog: add shell completion auto-fix entry
* feat: per-channel responsePrefix override (#9001)
* feat: per-channel responsePrefix override
Add responsePrefix field to all channel config types and Zod schemas,
enabling per-channel and per-account outbound response prefix overrides.
Resolution cascade (most specific wins):
L1: channels.<ch>.accounts.<id>.responsePrefix
L2: channels.<ch>.responsePrefix
L3: (reserved for channels.defaults)
L4: messages.responsePrefix (existing global)
Semantics:
- undefined -> inherit from parent level
- empty string -> explicitly no prefix (stops cascade)
- "auto" -> derive [identity.name] from routed agent
Changes:
- Core logic: resolveResponsePrefix() in identity.ts accepts
optional channel/accountId and walks the cascade
- resolveEffectiveMessagesConfig() passes channel context through
- Types: responsePrefix added to WhatsApp, Telegram, Discord, Slack,
Signal, iMessage, Google Chat, MS Teams, Feishu, BlueBubbles configs
- Zod schemas: responsePrefix added for config validation
- All channel handlers wired: telegram, discord, slack, signal,
imessage, line, heartbeat runner, route-reply, native commands
- 23 new tests covering backward compat, channel/account levels,
full cascade, auto keyword, empty string stops, unknown fallthrough
Fully backward compatible - no existing config is affected.
Fixes #8857
* fix: address CI lint + review feedback
- Replace Record<string, any> with proper typed helpers (no-explicit-any)
- Add curly braces to single-line if returns (eslint curly)
- Fix JSDoc: 'Per-channel' → 'channel/account' on shared config types
- Extract getChannelConfig() helper for type-safe dynamic key access
* fix: finish responsePrefix overrides (#9001) (thanks @mudrii)
* fix: normalize prefix wiring and types (#9001) (thanks @mudrii)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* Discord: allow disabling thread starter context
* feat(heartbeat): add accountId config option for multi-agent routing (#8702)
* feat(heartbeat): add accountId config option for multi-agent routing
Add optional accountId field to heartbeat configuration, allowing
multi-agent setups to explicitly specify which Telegram account
should be used for heartbeat delivery.
Previously, heartbeat delivery would use the accountId from the
session's deliveryContext. When a session had no prior conversation
history, heartbeats would default to the first/primary account
instead of the agent's intended bot.
Changes:
- Add accountId to HeartbeatSchema (zod-schema.agent-runtime.ts)
- Use heartbeat.accountId with fallback to session accountId (targets.ts)
Backward compatible: if accountId is not specified, behavior is unchanged.
Closes #8695
* fix: improve heartbeat accountId routing (#8702) (thanks @lsh411)
* fix: harden heartbeat accountId routing (#8702) (thanks @lsh411)
* fix: expose heartbeat accountId in status (#8702) (thanks @lsh411)
* chore: format status + heartbeat tests (#8702) (thanks @lsh411)
---------
Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* TUI/Gateway: fix pi streaming + tool routing + model display + msg updating (#8432)
* TUI/Gateway: fix pi streaming + tool routing
* Tests: clarify verbose tool output expectation
* fix: avoid seq gaps for targeted tool events (#8432) (thanks @gumadeiras)
* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)
* Telegram: remove @ts-nocheck from bot.ts and bot-message-dispatch.ts
- bot/types.ts: TelegramContext.me uses UserFromGetMe (Grammy) instead of manual inline type
- bot.ts: remove 6 unsafe casts (as any, as unknown, as object), use Grammy types directly
- bot.ts: remove dead message_thread_id access on reactions (not in Telegram Bot API)
- bot.ts: remove resolveThreadSessionKeys import (no longer needed for reactions)
- bot-message-dispatch.ts: replace ': any' with DispatchTelegramMessageParams type
- bot-message-dispatch.ts: add sticker.fileId guard before cache access
- bot.test.ts: update reaction tests, remove dead DM thread-reaction test
* Telegram: remove duplicate bot.catch handler (only the last one runs in Grammy)
* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)
* Security: Prevent gateway credential exfiltration via URL override (#9179)
* Gateway: require explicit auth for url overrides
* Gateway: scope credential blocking to non-local URLs only
Address review feedback: the previous fix blocked credential fallback for
ALL URL overrides, which was overly strict and could break workflows that
use --url to switch between loopback/tailnet without passing credentials.
Now credential fallback is only blocked for non-local URLs (public IPs,
external hostnames). Local addresses (127.0.0.1, localhost, private IPs
like 192.168.x.x, 10.x.x.x, tailnet 100.x.x.x) still get credential
fallback as before.
This maintains the security fix (preventing credential exfiltration to
attacker-controlled URLs) while preserving backward compatibility for
legitimate local URL overrides.
* Security: require explicit credentials for gateway url overrides (#8113) (thanks @victormier)
* Gateway: reuse explicit auth helper for url overrides (#8113) (thanks @victormier)
* Tests: format gateway chat test (#8113) (thanks @victormier)
* Tests: require explicit auth for gateway url overrides (#8113) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Tests: restore TUI gateway env
* Security: harden sandboxed media handling (#9182)
* Message: enforce sandbox for media param
* fix: harden sandboxed media handling (#8780) (thanks @victormier)
* chore: format message action runner (#8780) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Telegram: remove @ts-nocheck from bot-message.ts (#9180)
* Telegram: remove @ts-nocheck from bot-message.ts, type deps via Omit<BuildTelegramMessageContextParams>
* Telegram: widen allMedia to TelegramMediaRef[] so stickerMetadata flows through
* Telegram: remove @ts-nocheck from bot-message.ts (#9180)
* fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188)
* Security: owner-only tools + command auth hardening (#9202)
* Security: gate whatsapp_login by sender auth
* Security: treat undefined senderAuthorized as unauthorized (opt-in)
* fix: gate whatsapp_login to owner senders (#8768) (thanks @victormier)
* fix: add explicit owner allowlist for tools (#8768) (thanks @victormier)
* fix: normalize escaped newlines in send actions (#8768) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Telegram: remove @ts-nocheck from bot-handlers.ts, use Grammy types directly, deduplicate StickerMetadata
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Message: clarify media schema + fix MEDIA newline
* fix: enforce owner allowlist for commands
* fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241)
* fix: infer --auth-choice from API key flags during non-interactive onboarding
When --anthropic-api-key (or other provider key flags) is passed without
an explicit --auth-choice, the auth choice defaults to "skip", silently
discarding the API key. This means the gateway starts without credentials
and fails on every inbound message with "No API key found for provider".
Add inferAuthChoiceFromFlags() to derive the correct auth choice from
whichever provider API key flag was supplied, so credentials are persisted
to auth-profiles.json as expected.
Fixes #8481
* fix: infer auth choice from API key flags (#8484) (thanks @f-trycua)
* refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua)
---------
Co-authored-by: f-trycua <f@trycua.com>
* chore: sync plugin versions to 2026.2.3
* fix(mac): resolve cron schedule formatters
* chore(mac): update appcast for 2026.2.3
* chore: update 2026.2.3 notes
---------
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Shadow <shadow@clawd.bot>
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
Co-authored-by: CLAWDINATOR Bot <clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Marco Marandiz <admin-marco@Mac.lan>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Mariano Belinky <mariano@mb-server-643.local>
Co-authored-by: Mariano Belinky <mbelinky@gmail.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: Elarwei <elarweis@gmail.com>
Co-authored-by: bqcfjwhz85-arch <bqcfjwhz85@privaterelay.appleid.com>
Co-authored-by: lotusfall <lotusfall@outlook.com>
Co-authored-by: Ji <jizhang.work@gmail.com>
Co-authored-by: mac mimi <macmimi@macs-Mac-mini.local>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Justin <justinhuangcode@gmail.com>
Co-authored-by: Aldo <hal@aldo.pw>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com>
Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com>
Co-authored-by: Ethan Palm <56270045+ethanpalm@users.noreply.github.com>
Co-authored-by: Armin Ronacher <armin.ronacher@active-4.com>
Co-authored-by: Josh Palmer <joshpalmer123@gmail.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
Co-authored-by: Ermenegildo Fiorito <gildo.fiorito@gmail.com>
Co-authored-by: Michelle Tilley <michelle@michelletilley.net>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Stephen Chen <bochencleveland@yahoo.com>
Co-authored-by: stephenchen2025 <schenjobs@gmail.com>
Co-authored-by: Liu Weizhan <liu48566203@gmail.com>
Co-authored-by: Wangnov <48670012+Wangnov@users.noreply.github.com>
Co-authored-by: wangnov <1694546283@qq.com>
Co-authored-by: Yeom-JinHo <81306489+Yeom-JinHo@users.noreply.github.com>
Co-authored-by: Lucas Kim <ichbinlucas211@gmail.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
Co-authored-by: Glucksberg <markuscontasul@gmail.com>
Co-authored-by: Yudong Han <hanyd@pku.edu.cn>
Co-authored-by: Iranb <49674669+Iranb@users.noreply.github.com>
Co-authored-by: Seb Slight <sebslight@gmail.com>
Co-authored-by: mudrii <mudreac@gmail.com>
Co-authored-by: lsh411 <lsh411@gmail.com>
Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: Victor Mier <victormier@gmail.com>
Co-authored-by: f-trycua <f@trycua.com>
Co-authored-by: Nova <nova@noreply.github.com>
bestNiu
pushed a commit
to bestNiu/clawdbot
that referenced
this pull request
Feb 5, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
slathrop
referenced
this pull request
in slathrop/openclaw-js
Feb 6, 2026
batao9
pushed a commit
to batao9/openclaw
that referenced
this pull request
Feb 7, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
This was referenced Feb 8, 2026
hughdidit
pushed a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Feb 8, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> (cherry picked from commit 22927b0) # Conflicts: # CHANGELOG.md # src/commands/onboard-non-interactive.cloudflare-ai-gateway.test.ts # src/commands/onboard-non-interactive/local.ts
IxiAngel
added a commit
to subsubl/openclaw
that referenced
this pull request
Feb 9, 2026
* Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com>
FullStackKevinVanDriel
pushed a commit
to FullStackKevinVanDriel/openclaw
that referenced
this pull request
Feb 10, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
FullStackKevinVanDriel
pushed a commit
to FullStackKevinVanDriel/openclaw
that referenced
this pull request
Feb 10, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
FullStackKevinVanDriel
pushed a commit
to FullStackKevinVanDriel/openclaw
that referenced
this pull request
Feb 10, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
FullStackKevinVanDriel
pushed a commit
to FullStackKevinVanDriel/openclaw
that referenced
this pull request
Feb 10, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
Harihara04sudhan
added a commit
to armoriq/aiq-openclaw
that referenced
this pull request
Feb 10, 2026
* Security: owner-only tools + command auth hardening (#9202)
* Security: gate whatsapp_login by sender auth
* Security: treat undefined senderAuthorized as unauthorized (opt-in)
* fix: gate whatsapp_login to owner senders (#8768) (thanks @victormier)
* fix: add explicit owner allowlist for tools (#8768) (thanks @victormier)
* fix: normalize escaped newlines in send actions (#8768) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Telegram: remove @ts-nocheck from bot-handlers.ts, use Grammy types directly, deduplicate StickerMetadata
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Message: clarify media schema + fix MEDIA newline
* fix: enforce owner allowlist for commands
* fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241)
* fix: infer --auth-choice from API key flags during non-interactive onboarding
When --anthropic-api-key (or other provider key flags) is passed without
an explicit --auth-choice, the auth choice defaults to "skip", silently
discarding the API key. This means the gateway starts without credentials
and fails on every inbound message with "No API key found for provider".
Add inferAuthChoiceFromFlags() to derive the correct auth choice from
whichever provider API key flag was supplied, so credentials are persisted
to auth-profiles.json as expected.
Fixes #8481
* fix: infer auth choice from API key flags (#8484) (thanks @f-trycua)
* refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua)
---------
Co-authored-by: f-trycua <f@trycua.com>
* chore: sync plugin versions to 2026.2.3
* fix(mac): resolve cron schedule formatters
* chore(mac): update appcast for 2026.2.3
* chore: update 2026.2.3 notes
* Fix import error
* fix: gracefully downgrade xhigh thinking level in cron isolated agent (#9363)
When thinkingDefault is set to "xhigh" but the configured model does not
support it (e.g. Claude), the cron isolated-agent path throws a hard error
causing the job to fail. The interactive chat path already handles this by
silently downgrading to "high".
Apply the same graceful downgrade in the cron path: log a warning and
fall back to "high" instead of crashing.
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
* Add auth choice
* Optimize format
* Optimize doc
* Fix key resolve
* Optimize import
* fix: restore discord owner hint from allowlists
* fix: remove unused cron import
* fix(cli): resolve bundled chrome extension path
* test(cli): use unique temp dir for extension install
* fix(cli): support bundled extension path in dist root
* style(cli): satisfy lint rules in extension path resolver
* fix: resolve bundled chrome extension assets (#8914) (thanks @kelvinCB)
* Tests: add test coverage for security/windows-acl.ts
Adds comprehensive unit tests for Windows ACL inspection utilities:
- resolveWindowsUserPrincipal: username resolution with fallback
- parseIcaclsOutput: icacls output parsing
- summarizeWindowsAcl: ACL entry classification (trusted/world/group)
- inspectWindowsAcl: async ACL inspection with mocked exec
- formatWindowsAclSummary: summary string formatting
- formatIcaclsResetCommand: reset command string generation
- createIcaclsResetCommand: structured reset command generation
All 26 tests passing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: stabilize windows acl tests and command auth registry (#9335) (thanks @M00N7682)
* test: register discord plugin in allowlist test
* chore: bump version to 2026.2.4
* fix: resolve discord owner allowFrom matches
* fix(telegram): preserve DM topic threadId in deliveryContext
When receiving messages in Telegram DM topics (Topics in Private Chats),
the threadId was not saved in the session's deliveryContext, causing
replies to go to General chat instead of the topic.
Now we pass threadId to updateLastRoute for DM topics.
Fixes #8891
* test(telegram): add DM topic threadId deliveryContext test for #8891
Verifies that threadId is passed to updateLastRoute for DM topics.
Test fails on main branch, passes with the fix.
* fix: preserve telegram DM topic threadId (#9039) (thanks @lailoo)
* Update deps.
* chore: Typecheck test helper files.
* Docs: streamline start and install docs (#9648)
* docs(start): streamline getting started flow
* docs(nav): reorganize start and install sections
* docs(style): move custom css to style.css
* docs(navigation): align zh-CN ordering
* docs(navigation): localize zh-Hans labels
* docs(install): rename install overview page
* CLI: sort commands alphabetically in help output
Fixes #7964
Added sortSubcommands: true to configureHelp() to display
commands in alphabetical order when running 'openclaw --help'.
* fix: update changelog for help sorting (#8068) (thanks @deepsoumya617)
* docs(onboarding): add bootstrapping page (#9767)
* docs: fix onboarding rendering issues
* chore: reset appcast to 2026.2.3
* fix(telegram): pass parentPeer for forum topic binding inheritance (#9789)
Fixes #9545 and #9351.
When a message comes from a Telegram forum topic, the peer ID includes
the topic suffix (e.g., `-1001234567890:topic:99`). Users configure
bindings with the base group ID, which previously did not match.
This adds `parentPeer` to `resolveAgentRoute()` calls for forum groups,
enabling binding inheritance from the parent group to all topics.
- Extract `buildTelegramParentPeer()` helper in bot/helpers.ts
- Pass parentPeer in bot-message-context.ts, bot-handlers.ts,
bot-native-commands.ts, and bot.ts (reaction handler)
- Add tests for forum topic routing and topic precedence
* docs(onboarding): streamline CLI onboarding docs (#9830)
* fix: auto-inject Telegram forum topic threadId in message tool
When using Telegram DM topics (forum topics), messages sent via the
message tool (media, buttons, etc.) land in General Topic instead of
the user's current topic. This happens because Slack has
resolveSlackAutoThreadId for auto-threading but Telegram had no
equivalent.
Add resolveTelegramAutoThreadId that mirrors the Slack pattern:
- When channel is telegram and no explicit threadId is provided
- Check if toolContext.currentThreadTs (the topic ID) is set
- Verify the target matches the originating chat
- Inject the threadId into params so the Telegram plugin action
handler picks it up for sendMessage/sendMedia
The subagent announce path already correctly passes threadId via
requesterOrigin (set from agentThreadId in sessions-spawn-tool),
so no changes needed there.
* test: cover telegram topic threadId auto-injection and subagent origin threading
* fix: pass threadId/to/accountId from parent to subagent gateway call
When spawning a subagent, the requesterOrigin's threadId, to, and
accountId were not forwarded to the callGateway({method:'agent'}) params.
This meant the subagent's runContext had no currentThreadTs or
currentChannelId, so resolveTelegramAutoThreadId could not auto-inject
the forum topic thread ID when the subagent used the message tool.
Changes:
- sessions-spawn-tool: pass to, accountId, threadId from requesterOrigin
- run-context: populate currentChannelId from opts.to as fallback
Fixes subagent messages landing in General Topic instead of the correct
Telegram DM topic thread.
* fix: telegram topic auto-threading — use parseTelegramTarget, add tests (#7235) (thanks @Lukavyi)
* update handle
* docs: fix incorrect model.fallback to model.fallbacks in Ollama config (#9384) (#9749)
Both English and Chinese documentation had incorrect configuration template
using 'fallback' instead of 'fallbacks' in agents.defaults.model config.
Co-authored-by: damaozi <1811866786@qq.com>
* fix(cli): avoid NODE_OPTIONS for --disable-warning (#9691) (thanks @18-RAJAT)
Fixes npm pack failing on modern Node where --disable-warning is disallowed in NODE_OPTIONS.
* feat: add Claude Opus 4.6 to built-in model catalog (#9853)
* feat: add Claude Opus 4.6 to built-in model catalog
- Update default model from claude-opus-4-5 to claude-opus-4-6
- Add opus-4.6 model ID normalization
- Add claude-opus-4-6 to live model filter prefixes
- Update image tool to prefer claude-opus-4-6 for vision
- Add CLI backend alias for opus-4.6
- Update onboard auth default selections to include opus-4.6
- Update model picker placeholder
Closes #9811
* test: update tests for claude-opus-4-6 default
- Fix model-alias-defaults test to use claude-opus-4-6
- Fix image-tool test to expect claude-opus-4-6 in fallbacks
* feat: support claude-opus-4-6
* docs: update changelog for opus 4.6 (#9853) (thanks @TinyTb)
* chore: bump pi to 0.52.0
---------
Co-authored-by: Slurpy <slurpy@openclaw.ai>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* 🤖 Feishu: expand channel support
What:
- add post parsing, doc link extraction, routing, replies, reactions, typing, and user lookup
- fix media download/send flows and make doc fetches domain-aware
- update Feishu docs and clawtributor credits
Why:
- raise Feishu parity with other channels and avoid dropped group messages
- keep replies threaded while supporting Lark domains
- document new configuration and credit the contributor
Tests:
- pnpm build
- pnpm check
- pnpm test (gateway suite timed out; reran pnpm vitest run --config vitest.gateway.config.ts)
Co-authored-by: 九灵云 <server@jiulingyun.cn>
* 🤖 Feishu: tighten mention gating
What:
- require the bot open_id match for group mention detection when available
Why:
- prevent replies when other users are mentioned and the bot id is known
Tests:
- pnpm test
* fix: remove orphaned tool_results during compaction pruning
When pruneHistoryForContextShare drops chunks of messages, it could drop
an assistant message with tool_use blocks while leaving corresponding
tool_result messages in the kept portion. These orphaned tool_results
cause Anthropic's API to reject the session with 'unexpected tool_use_id'.
Fix by calling repairToolUseResultPairing after each chunk drop to clean
up any orphaned tool_results. This reuses existing battle-tested code
from session-transcript-repair.ts.
Fixes #9769, #9724, #9672
* fix cron scheduling and reminder delivery regressions (#9733)
* fix(cron): prevent timer from allowing process exit (fixes #9694)
The cron timer was using .unref(), which caused the Node.js event
loop to exit or sleep if no other handles were active. This prevented
cron jobs from firing in some environments.
* fix(cron): infer delivery target for isolated jobs (fixes #9683)
When creating isolated agentTurn jobs (e.g. reminders) without explicit
delivery options, the job would default to 'announce' but fail to
resolve the target conversation. Now, we infer the channel and
recipient from the agent's current session key.
* fix(cron): enhance delivery inference for threaded sessions and null inputs (#9733)
Improves the delivery inference logic in the cron tool to correctly handle threaded session keys and cases where delivery is explicitly set to null. This ensures that the appropriate delivery mode and target are inferred based on the agent's session key, enhancing the reliability of job execution.
* fix: preserve telegram topic delivery inference (#9733) (thanks @tyler6204)
* fix: simplify cron delivery merge spread (#9733) (thanks @tyler6204)
* chore: add agent credentials to gitignore (#9874)
Protect sensitive files from accidental commit:
- memory/ (moltbook credentials, session data)
- .agent/*.json (agent config, moltbook.json)
Workflows in .agent/workflows/ remain tracked.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Docs: escape hash symbol in help channel names in issue template (#9695)
* feat(skills): add QR code skill (#8817)
feat(skills): add QR code generation and reading skill
Adds qr-code skill with:
- qr_generate.py - Generate QR codes with customizable size/error correction
- qr_read.py - Decode QR codes from images
- SKILL.md documentation
Co-authored-by: Omar-Khaleel
* chore(agentsmd): add tsgo command to AGENTS.md (#9894)
Add `pnpm tsgo` command to AGENTS.md development reference
Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com>
* fix(runtime): bump minimum Node.js version to 22.12.0 (#5370)
* fix(runtime): bump minimum Node.js version to 22.12.0
Aligns the runtime guard with the declared package.json engines requirement.
The Matrix plugin (and potentially others) requires Node >= 22.12.0,
but the runtime guard previously allowed 22.0.0+. This caused confusing
errors like 'Cannot find module @vector-im/matrix-bot-sdk' when the real
issue was an unsupported Node version.
- Update MIN_NODE from 22.0.0 to 22.12.0
- Update error message to reflect the correct version
- Update tests to use 22.12.0 as the minimum valid version
Fixes #5292
* fix: update test versions to match MIN_NODE=22.12.0
---------
Co-authored-by: Markus Glucksberg <markus@glucksberg.com>
* fix: clear stale token metrics on /new and /reset (#8929)
When starting a new session via /new or /reset, the token usage fields
(totalTokens, inputTokens, outputTokens, contextTokens) survived from the
previous session via the spread pattern in session init. This caused /status
to display misleading context usage from the old session.
Clear all four token metrics explicitly in the isNewSession block, alongside
the existing compactionCount reset. Also add diagnostic logging for session
forking via ParentSessionKey to help trace context inheritance.
* chore: apply local workspace updates (#9911)
* chore: apply local workspace updates
* fix: resolve prep findings after rebase (#9898) (thanks @gumadeiras)
* refactor: centralize model allowlist normalization (#9898) (thanks @gumadeiras)
* fix: guard model allowlist initialization (#9911)
* docs: update changelog scope for #9911
* docs: remove model names from changelog entry (#9911)
* fix: satisfy type-aware lint in model allowlist (#9911)
* fix: allow multiple compaction retries on context overflow (#8928)
Previously, overflowCompactionAttempted was a boolean flag set once, preventing
recovery when a single compaction wasn't enough. Change to a counter allowing up
to 3 attempts before giving up. Also add diagnostic logging on overflow events to
help debug early-overflow issues.
Fixes sessions that hit context overflow during long agentic turns with many tool
calls, where one compaction round isn't sufficient to bring context below limits.
* fix(errors): show clear billing error instead of cryptic API response (#8391)
* fix(errors): return clear billing error message instead of cryptic raw error (#8136)
When an LLM API provider returns a credit/billing-related error (HTTP 402,
insufficient credits, low balance, etc.), OpenClaw now shows a clear,
actionable message instead of passing through the raw/cryptic error text:
⚠️ API provider returned a billing error — your API key has run out of
credits or has an insufficient balance. Check your provider's billing
dashboard and top up or switch to a different API key.
Changes:
- formatAssistantErrorText: detect billing errors via isBillingErrorMessage()
and return a user-friendly message (placed before the generic HTTP/JSON
error fallthrough)
- sanitizeUserFacingText: same billing detection for the sanitization path
- pi-embedded-runner/run.ts: add billingFailure detection in the profile
exhaustion fallback, so the FailoverError message is billing-specific
- Added 3 new tests for credit balance, HTTP 402, and insufficient credits
* fix: extract billing error message to shared constant
* Revert "feat(skills): add QR code skill (#8817)"
This reverts commit ad13c265ba1fd22dadfe30325ed998d9a3d95e5c.
* docs: improve DM security guidance with concrete example
Add a more prominent security warning for multi-user DM setups:
- Add blockquote security warning about context leakage
- Include concrete example showing the privacy risk
- Add "When to enable this" checklist
- Clarify that default is fine for single-user setups
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: tighten secure DM example
* docs: note secure DM guidance update (#9377) (thanks @Shrinija17)
* Agents: bump pi-mono to 0.52.5 (#9949)
* Agents: bump pi-mono to 0.52.5
* Changelog: add PR reference for pi bump
* docs: restructure Get Started tab and improve onboarding flow (#9950)
* docs: restructure Get Started tab and improve onboarding flow
- Flatten nested Onboarding group into linear First Steps flow
- Add 'What is OpenClaw?' narrative section to landing page
- Split wizard.md into streamlined overview + full reference (reference/wizard.md)
- Move Pairing to Channels > Configuration
- Move Bootstrapping to Agents > Fundamentals
- Move macOS app onboarding to Platforms > macOS companion app
- Move Lore to Help > Community
- Remove duplicate install instructions from openclaw.md
- Mirror navigation changes in zh-CN tabs
- No content deleted — all detail preserved or relocated
* docs: move deployment pages to install/, fix Platforms tab routing, clarify onboarding paths
- Move deployment guides (fly, hetzner, gcp, macos-vm, exe-dev, railway, render,
northflank) from platforms/ and root to install/
- Add 'Hosting and deployment' group to Install tab
- Slim Gateway & Ops 'Remote access and deployment' down to 'Remote access'
- Swap Platforms tab before Gateway & Ops to fix path-prefix routing
- Move macOS app onboarding into First steps (parallel to CLI wizard)
- Rename sidebar titles to 'Onboarding: CLI' / 'Onboarding: macOS App'
- Add redirects for all moved paths
- Update all internal links (en + zh-CN)
- Fix img tag syntax in onboarding.md
* fix(telegram): accept messages from group members in allowlisted groups (#9775)
* fix(telegram): accept messages from group members in allowlisted groups
Issue #4559: Telegram bot was silently dropping messages from non-paired users
in allowlisted group chats due to overly strict sender filtering.
The fix adds a check to distinguish between:
1. Group itself is allowlisted → accept messages from any member
2. Group is NOT allowlisted → only accept from allowlisted senders
Changes:
- Check if group ID is in the allowlist (or allowlist is wildcard)
- Only reject sender if they're not in allowlist AND group is not allowlisted
- Improved logging to indicate the actual reason for rejection
This preserves security controls while fixing the UX issue where group members
couldn't participate unless individually allowlisted.
Backwards compatible: existing allowlists continue to work as before.
* style: format telegram fix for oxfmt compliance
* refactor(telegram): clarify group allowlist semantics in fix for #4559
Changes:
- Rename 'isGroupInAllowlist' to 'isGroupChatIdInAllowlist' for clarity
- Expand comments to explain the semantic distinction:
* Group chat ID in allowlist -> accept any group member (fixes #4559)
* Group chat ID NOT in allowlist -> enforce sender allowlist (preserves security)
- This addresses concerns about config semantics raised in code review
The fix maintains backward compatibility:
- 'groupAllowFrom' with group chat IDs now correctly acts as group enablement
- 'groupAllowFrom' with sender IDs continues to work as sender allowlist
- Operators should use group chat IDs for group enablement, sender IDs for sender control
Note: If operators were using 'groupAllowFrom' with group IDs expecting sender-level
filtering, they should migrate to a separate sender allowlist config. This is the
intended behavior per issue #4559.
* Telegram: allow per-group groupPolicy overrides
* Telegram: support per-group groupPolicy overrides (#9775) (thanks @nicolasstanley)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
* chore: remove tracked .DS_Store files
* Fix: Enable scrolling on the dashboard config page (#1822)
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* feat: add xAI Grok provider support
* fix(onboard): align xAI default model to grok-4
* chore: changelog for xAI onboarding (#9885) (thanks @grp06)
* fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer (#9823)
* fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer
ensureLoaded(forceReload) called recomputeNextRuns before runDueJobs,
which recalculated nextRunAtMs to a strictly future time. Since
setTimeout always fires a few ms late, the due check (now >= nextRunAtMs)
always failed and every/cron jobs never executed. Fixes #9788.
* docs: add changelog entry for cron timer race fix (#9823) (thanks @pycckuu)
---------
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
* fix(cron): re-arm timer in finally to survive transient errors (#9948)
* fix(cron): handle legacy atMs field in schedule when computing next run (#9932)
* fix(cron): handle legacy atMs field in schedule when computing next run
The cron scheduler only checked for `schedule.at` (string) but legacy jobs
may have `schedule.atMs` (number) from before the schema migration.
This caused nextRunAtMs to stay null because:
1. Store migration runs on load but may not persist immediately
2. Race conditions or file mtime issues can skip migration
3. computeJobNextRunAtMs/computeNextRunAtMs only checked `at`, not `atMs`
Fix: Make both functions defensive by checking `atMs` first (number),
then `atMs` (string, for edge cases), then falling back to `at` (string).
This ensures jobs fire correctly even if:
- Migration hasn't run yet
- Old data was written by a previous version
- The store was manually edited
Fixes #9930
* fix: validate numeric atMs to prevent NaN/Infinity propagation
Addresses review feedback - numeric atMs values are now validated with
Number.isFinite() && atMs > 0 before use. This prevents corrupted or
manually edited stores from causing hot timer loops via setTimeout(..., NaN).
* fix(exec-approvals): coerce bare string allowlist entries to objects (#9790)
* fix(exec-approvals): coerce bare string allowlist entries (#9903) (thanks @mcaxtr)
* security: add skill/plugin code safety scanner (#9806)
* security: add skill/plugin code safety scanner module
* security: integrate skill scanner into security audit
* security: add pre-install code safety scan for plugins
* style: fix curly brace lint errors in skill-scanner.ts
* docs: add changelog entry for skill code safety scanner
* style: append ellipsis to truncated evidence strings
* fix(security): harden plugin code safety scanning
* fix: scan skills on install and report code-safety details
* fix: dedupe audit-extra import
* fix(security): make code safety scan failures observable
* fix(test): stabilize smoke + gateway timeouts (#9806) (thanks @abdelsfane)
---------
Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu>
Co-authored-by: Darshil <81693876+dvrshil@users.noreply.github.com>
Co-authored-by: George Pickett <gpickett00@gmail.com>
* Thinking: accept extra-high alias and sync Codex FAQ wording
* Changelog: note #9976 thinking alias + Codex 5.3 docs sync
* fix: normalize xhigh aliases and docs sync (#9976)
* fix(agents): skip tool extraction for aborted/errored assistant messages (#4598)
Fixes tool call/tool_result pairing issues that cause permanent session corruption when assistant messages have stopReason "error" or "aborted". Includes 4 unit tests.
* fix(cron): handle undefined sessionTarget in list output (#9649) (#9752)
* fix(cron): handle undefined sessionTarget in list output (#9649)
When sessionTarget is undefined, pad() would crash with 'Cannot read
properties of undefined (reading trim)'. Use '-' as fallback value.
* test(cron): add regression test for undefined sessionTarget (#9649)
Verifies that printCronList handles jobs with undefined sessionTarget
without crashing. Test fails on main branch, passes with the fix.
* fix: use correct CronSchedule format in tests (#9752) (thanks @lailoo)
Tests were using { kind: 'at', atMs: number } but the CronSchedule type
requires { kind: 'at', at: string } where 'at' is an ISO date string.
---------
Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
* chore: Update deps.
* Model: add strict gpt-5.3-codex fallback for OpenAI Codex (fixes #9989) (#9995)
* Model: allow forward-compatible OpenAI Codex GPT-5 IDs
* Model: scope Codex fallback to gpt-5.3-codex
* fix: reorder codex fallback before providerCfg, add ordering test, changelog (#9989) (thanks @w1kke)
---------
Co-authored-by: Robin <4robinlehmann@gmail.com>
* fix(nextcloud-talk): sign message text instead of JSON body (#2092)
Nextcloud Talk's ChecksumVerificationService verifies HMAC against the
extracted message/reaction text, not the full JSON body. This fixes 401
authentication errors when sending messages via the bot API.
- sendMessageNextcloudTalk: sign 'message' text only
- sendReactionNextcloudTalk: sign 'reaction' string only
* fix(slack): add mention stripPatterns for /new and /reset commands (#9971)
* fix(slack): add mention stripPatterns for /new and /reset commands
Fixes #9937
The Slack dock was missing mentions.stripPatterns that Discord has.
This caused /new and /reset to fail when sent with a mention
(e.g. @bot /reset) because <@USERID> wasn't stripped before matching.
* fix(slack): strip mentions for /new and /reset (#9971) (thanks @ironbyte-rgb)
---------
Co-authored-by: ironbyte-rgb <amontaboi76@gmail.com>
Co-authored-by: George Pickett <gpickett00@gmail.com>
* feat(feishu): replace built-in SDK with community plugin
Replace the built-in Feishu SDK with the community-maintained
clawdbot-feishu plugin by @m1heng.
Changes:
- Remove src/feishu/ directory (19 files)
- Remove src/channels/plugins/outbound/feishu.ts
- Remove src/channels/plugins/normalize/feishu.ts
- Remove src/config/types.feishu.ts
- Remove feishu exports from plugin-sdk/index.ts
- Remove FeishuConfig from types.channels.ts
New features in community plugin:
- Document tools (read/create/edit Feishu docs)
- Wiki tools (navigate/manage knowledge base)
- Drive tools (folder/file management)
- Bitable tools (read/write table records)
- Permission tools (collaborator management)
- Emoji reactions support
- Typing indicators
- Rich media support (bidirectional image/file transfer)
- @mention handling
- Skills for feishu-doc, feishu-wiki, feishu-drive, feishu-perm
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(feishu): add targeted eslint-disable comments for SDK integration
Add line-specific eslint-disable-next-line comments for SDK type casts
and union type issues, rather than file-level disables.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(feishu): fix webhook mode silent exit and receive_id_type default
- monitor.ts: throw error for webhook mode instead of silently returning,
so gateway properly marks channel as failed
- targets.ts: default receive_id_type to "user_id" instead of "open_id"
for non-prefixed IDs, fixing message delivery for enterprise user IDs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: update pnpm-lock.yaml for feishu extension deps
Add lockfile entries for:
- @larksuiteoapi/node-sdk@^1.56.1
- @sinclair/typebox@0.34.47
- zod@^4.3.6
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(feishu): sync with clawdbot-feishu #137 (multi-account support)
- Sync latest changes from clawdbot-feishu including multi-account support
- Add eslint-disable comments for SDK-related any types
- Remove unused imports
- Fix no-floating-promises in monitor.ts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* security: redact credentials from config.get gateway responses (#9858)
* security: add skill/plugin code safety scanner module
* security: integrate skill scanner into security audit
* security: add pre-install code safety scan for plugins
* style: fix curly brace lint errors in skill-scanner.ts
* docs: add changelog entry for skill code safety scanner
* security: redact credentials from config.get gateway responses
The config.get gateway method returned the full config snapshot
including channel credentials (Discord tokens, Slack botToken/appToken,
Telegram botToken, Feishu appSecret, etc.), model provider API keys,
and gateway auth tokens in plaintext.
Any WebSocket client—including the unauthenticated Control UI when
dangerouslyDisableDeviceAuth is set—could read every secret.
This adds redactConfigSnapshot() which:
- Deep-walks the config object and masks any field whose key matches
token, password, secret, or apiKey patterns
- Uses the existing redactSensitiveText() to scrub the raw JSON5 source
- Preserves the hash for change detection
- Includes 15 test cases covering all channel types
* security: make gateway config writes return redacted values
* test: disable control UI by default in gateway server tests
* fix: redact credentials in gateway config APIs (#9858) (thanks @abdelsfane)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
* fix: release session locks on process termination (#1962)
Adds cleanup handlers to release held file locks when the process
terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned
lock files that would block future sessions.
Fixes #1951
* fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support (#9870)
* fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support
Adds configurable streaming parameter to model configuration and sets streaming
to false by default for Ollama models. This addresses the corrupted response
issue caused by upstream SDK bug badlogic/pi-mono#1205 where interleaved
content/reasoning deltas in streaming responses cause garbled output.
Changes:
- Add streaming param to AgentModelEntryConfig type
- Set streaming: false default for Ollama models
- Add OLLAMA_API_KEY to envMap (was missing, preventing env var auth)
- Document streaming configuration in Ollama provider docs
- Add tests for Ollama model configuration
Users can now configure streaming per-model and Ollama authentication
via OLLAMA_API_KEY environment variable works correctly.
Fixes #8839
Related: badlogic/pi-mono#1205
* docs(ollama): use gpt-oss:20b as primary example
Updates documentation to use gpt-oss:20b as the primary example model
since it supports tool calling. The model examples now show:
- gpt-oss:20b as the primary recommended model (tool-capable)
- llama3.3 and qwen2.5-coder:32b as additional options
This provides users with a clear, working example that supports
OpenClaw's tool calling features.
* chore: remove unused vi import from ollama test
* fix: untrack dist/control-ui build artifacts (#1856)
The dist/control-ui/ files were committed before the dist/ gitignore
rule was effective. These build artifacts get regenerated during
builds, causing dirty repo errors that block the auto-update mechanism.
Removes the files from git tracking while keeping them locally and
respecting the existing dist/ gitignore entry.
Fixes #1838
Co-authored-by: Claude <noreply@anthropic.com>
* add PR review workflow templates
* fix: wire onToolResult callback for verbose tool summaries (#2022)
HOTFIX: Tool summaries were not being sent to chat channels when verbose mode
was enabled. The onToolResult callback was defined in the types but never
wired up in dispatch-from-config.ts.
This adds the missing callback alongside onBlockReply, using the same
dispatcher.sendBlockReply() path to deliver tool summaries to WhatsApp,
Telegram, and other chat channels.
Fixes verbose tool summaries not appearing in WhatsApp despite /verbose on.
* fix: Gateway canvas host bypasses auth and serves files unauthenticated
* fix(gateway): require auth for canvas host and a2ui assets (#9518) (thanks @coygeek)
* Add proper `onToolResult` fallback.
* chore: Add VS Code defaults and extensions so that Oxlint/Oxfmt work automatically.
* fix(docs): correct OpenCode Zen description in code comment (#9998)
* fix(docs): correct OpenCode Zen description in code comment
OpenCode Zen is a pay-as-you-go token-based API, not a $200/month
subscription. The subscription tiers ($20/$100/$200) are OpenCode Black,
a separate product.
This fixes the misleading comment that conflated Zen with Black.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: align OpenCode Zen billing copy (#9998) (thanks @therealZpoint-bot)
---------
Co-authored-by: Claude <claude@archibald.local>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* fix: `onToolResult` fallback is not expected.
* fix: Do not `process.exit(0)` in the middle of a test.
* chore: Fix audit test on Windows.
* Cap sessions_history payloads to prevent context overflow (#10000)
* Cap sessions_history payloads to prevent context overflow
* fix: harden sessions_history payload caps
* fix: cap sessions_history payloads to prevent context overflow (#10000) (thanks @gut-puncture)
---------
Co-authored-by: Shailesh Rana <shaileshrana@ShaileshMM.local>
Co-authored-by: George Pickett <gpickett00@gmail.com>
* Chore: Update memory.md with current default workspace path (#9559)
Removed 'clawd' workspace reference - updated with current default workspace path of '~/.openclaw/workspace'
* fix: silence unused hook token url param (#9436)
* fix: Gateway authentication token exposed in URL query parameters
* fix: silence unused hook token url param
* fix: remove gateway auth tokens from URLs (#9436) (thanks @coygeek)
* test: fix Windows path separators in audit test (#9436)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
* docs: add activeHours to heartbeat field notes and examples (#9366)
Co-authored-by: unisone <unisone@users.noreply.github.com>
* docs: update clawtributors (add @unisone)
* chore: run lint step after build during preflight check
* fix: add fallback for Control UI asset resolution in global installs
* fix: remove dead restore control-ui step from update runner
* Web UI: add token usage dashboard (#10072)
* feat(ui): Token Usage dashboard with session analytics
Adds a comprehensive Token Usage view to the dashboard:
Backend:
- Extended session-cost-usage.ts with per-session daily breakdown
- Added date range filtering (startMs/endMs) to API endpoints
- New sessions.usage, sessions.usage.timeseries, sessions.usage.logs endpoints
- Cost breakdown by token type (input/output/cache read/write)
Frontend:
- Two-column layout: Daily chart + breakdown | Sessions list
- Interactive daily bar chart with click-to-filter and shift-click range select
- Session detail panel with usage timeline, conversation logs, context weight
- Filter chips for active day/session selections
- Toggle between tokens/cost view modes (default: cost)
- Responsive design for smaller screens
UX improvements:
- 21-day default date range
- Debounced date input (400ms)
- Session list shows filtered totals when days selected
- Context weight breakdown shows skills, tools, files contribution
* fix(ui): restore gatewayUrl validation and syncUrlWithSessionKey signature
- Restore normalizeGatewayUrl() to validate ws:/wss: protocol
- Restore isTopLevelWindow() guard for iframe security
- Revert syncUrlWithSessionKey signature (host param was unused)
* feat(ui): Token Usage dashboard with session analytics
Adds a comprehensive Token Usage view to the dashboard:
Backend:
- Extended session-cost-usage.ts with per-session daily breakdown
- Added date range filtering (startMs/endMs) to API endpoints
- New sessions.usage, sessions.usage.timeseries, sessions.usage.logs endpoints
- Cost breakdown by token type (input/output/cache read/write)
Frontend:
- Two-column layout: Daily chart + breakdown | Sessions list
- Interactive daily bar chart with click-to-filter and shift-click range select
- Session detail panel with usage timeline, conversation logs, context weight
- Filter chips for active day/session selections
- Toggle between tokens/cost view modes (default: cost)
- Responsive design for smaller screens
UX improvements:
- 21-day default date range
- Debounced date input (400ms)
- Session list shows filtered totals when days selected
- Context weight breakdown shows skills, tools, files contribution
* fix: usage dashboard data + cost handling (#8462) (thanks @mcinteerj)
* Usage: enrich metrics dashboard
* Usage: add latency + model trends
* Gateway: improve usage log parsing
* UI: add usage query helpers
* UI: client-side usage filter + debounce
* Build: harden write-cli-compat timing
* UI: add conversation log filters
* UI: fix usage dashboard lint + state
* Web UI: default usage dates to local day
* Protocol: sync session usage params (#8462) (thanks @mcinteerj, @TakHoffman)
---------
Co-authored-by: Jake McInteer <mcinteerj@gmail.com>
* fix: CLI harden update restart imports and fix nested bundle version resolution
* Docs: add PR and issue submission guides (#10150)
* Docs: add PR and issue submission guides
* Docs: fix LLM-assisted wording
* Update: harden control UI asset handling in update flow (#10146)
* Update: harden control UI asset handling in update flow
* fix: harden update doctor entrypoint guard (#10146) (thanks @gumadeiras)
* Support ERNIE-5.0-Thinking-Preview
* Resolve conflicts
* Fix conflicts
* Docs: sharpen Install tab to stop duplicating Getting Started (#10416)
* docs(install): reframe install overview to stop duplicating getting started
* docs(install): link default installer row to getting started, not internals
* docs(install): use Mintlify components for install overview
* docs(install): fix card grid layout with CardGroup
* docs(install): platform tabs for global install, npm/pnpm as accordion
* docs(install): add PowerShell no-onboard alternative
* docs(install): add repo link to from-source clone step
* docs(install): capitalize OpenClaw in repo link
* docs(install): add pnpm link --global to from-source steps
* docs(install): rewrite install overview for clarity and flow
* docs(install): use tooltip for Windows WSL2 recommendation
* docs(install): use Note box for Windows WSL2 recommendation
* docs(install): group install methods under single heading
* docs(install): standardize tab labels across installer sections
* docs(install): rewrite Node.js page with install instructions and better structure
* docs(install): clarify Node.js page intro
* docs(install): scope auto-install note to installer script, link Node page
* docs(install): fix installer script link to internals page
* docs: rename Install methods nav group to Other install methods
* docs(install): link to on-page anchor, use Tip box for recommended
* docs(install): wrap install methods in AccordionGroup with Tip box
* docs: move Node.js page from Install to Help > Environment and debugging
* docs(install): add complete flags and env vars reference to installer internals
* docs(install): use stable troubleshooting anchor for Node.js link
* docs(install): fix Node page installer anchor
* docs(install): fix broken installer script anchor in requirements note
* feat: add markdownlint configuration for documentation formatting and linting
* docs: linting
* docs(markdownlint): enable autofixable rules and normalize links
* revert(docs): undo markdownlint autofix churn
* Docs: enable markdownlint autofixables except list numbering (#10476)
* docs(markdownlint): enable autofixable rules except list numbering
* docs(zalo): fix malformed bot platform link
* Docs: revamp installer internals for readability and accuracy (#10499)
* docs(install): revamp installer internals for readability and accuracy
Restructure the installer internals page with better flow and Mintlify
components (CardGroup, Steps, Tabs, AccordionGroup). All flags, env vars,
and behavioral descriptions cross-checked against install.sh,
install-cli.sh, and install.ps1 source code.
- Add CardGroup chooser and Quick Commands section at top
- Organize each script into consistent Flow → Examples → Reference pattern
- Move flags/env var tables into collapsible Accordions
- Consolidate troubleshooting into AccordionGroup at bottom
- Add missing flags (--version, --beta, --verbose, --help, etc.)
- Add missing env vars (OPENCLAW_VERSION, OPENCLAW_BETA, etc.)
- Document install-cli.sh fully (was one paragraph)
- Fix non-interactive checkout detection behavior (defaults to npm)
- Use --proto/--tlsv1.2 in curl examples to match script usage
- No content deleted; all original info preserved or relocated
* fix(docs): correct in-page anchor hrefs for installer cards
* docs(install): replace CardGroup with table for installer overview
* Docs: add PR sign-off template (#10561)
* fix: guard resolveUserPath against undefined input (#10176)
* fix: guard resolveUserPath against undefined input
When subagent spawner omits workspaceDir, resolveUserPath receives
undefined and crashes on .trim(). Add a falsy guard that falls back
to process.cwd(), matching the behavior callers already expect.
Closes #10089
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: harden runner workspace fallback (#10176) (thanks @Yida-Dev)
* fix: harden workspace fallback scoping (#10176) (thanks @Yida-Dev)
* refactor: centralize workspace fallback classification and redaction (#10176) (thanks @Yida-Dev)
* test: remove explicit any from utils mock (#10176) (thanks @Yida-Dev)
* security: reject malformed agent session keys for workspace resolution (#10176) (thanks @Yida-Dev)
---------
Co-authored-by: Yida-Dev <reyifeijun@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* Docs: revise PR and issue submission guides (#10617)
* Docs: revise PR submission guide
* Docs: revise issue submission guide
* feat(memory): native Voyage AI support (#7078)
* feat(memory): add native Voyage AI embedding support with batching
Cherry-picked from PR #2519, resolved conflict in memory-search.ts
(hasRemote -> hasRemoteConfig rename + added voyage provider)
* fix(memory): optimize voyage batch memory usage with streaming and deduplicate code
Cherry-picked from PR #2519. Fixed lint error: changed this.runWithConcurrency
to use imported runWithConcurrency function after extraction to internal.ts
* feat(memory): document Voyage embeddings + VOYAGE_API_KEY (#7078) (thanks @mcinteerj) (#10699)
* feat(antigravity): update default model to Claude Opus 4.6 (#10720)
* feat(antigravity): update default model to Claude Opus 4.6
Claude Opus 4.5 has been replaced by Claude Opus 4.6 on the
Antigravity (Google Cloud Code Assist) platform.
- Update DEFAULT_MODEL in google-antigravity-auth extension
- Update testing docs to reference the new model
* fix: update remaining antigravity opus 4.5 refs in zh-CN docs and tests
Address review comments from Greptile:
- Update zh-CN/testing.md antigravity model references
- Update pi-tools-agent-config.test.ts model IDs
* Antigravity: default OAuth model to Opus 4.6 (#10720) (thanks @calvin-hpnet)
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
* fix(hooks): replace debug console.log with proper subsystem logging in session-memory (#10730)
* fix: replace debug console.log with proper subsystem logging in session-memory
* fix(hooks): normalize session-memory subsystem logging
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
* docs(changelog): prepare 2026.2.6
* docs(changelog): include merged PRs since v2026.2.3
* chore(release): bump version to 2026.2.6
* fix(telegram): cast fetch for grammY ApiClientOptions
* docs: fix markdownlint fragments + headings
* docs(changelog): refresh 2026.2.6 since v2026.2.3
* docs(imessage): add macOS TCC troubleshooting
* docs(imessage): improve macOS TCC troubleshooting guidance (#10781)
* chore(deps): update deps
* fix(agents): add Opus 4.6 forward-compat fallback
* chore(deps): bump carbon beta
* docs(changelog): curate 2026.2.6
* docs(changelog): highlight Opus 4.6 + Codex 5.3 first
* Fix QMD CLI installation link in memory.md (#8647)
Correct the installation link for the QMD CLI in the documentation.
* chore(lockfile): fix pnpm-lock
* fix: cron scheduler reliability, store hardening, and UX improvements (#10776)
* refactor: update cron job wake mode and run mode handling
- Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands.
- Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options.
- Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures.
- Added new tests for delivery plan consistency and job execution behavior under various conditions.
- Improved normalization functions to handle wake mode and session target casing.
This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality.
* test: enhance cron job functionality and UI
- Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram.
- Implemented a new function to pick the last deliverable payload from a list of delivery payloads.
- Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules.
- Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules.
- Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments.
These changes aim to improve the reliability and user experience of the cron job system.
* test: enhance sessions thinking level handling
- Added tests to verify that the correct thinking levels are applied during session spawning.
- Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels.
- Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns.
These changes aim to improve the flexibility and accuracy of thinking level configurations in session management.
* feat: enhance session management and cron job functionality
- Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options.
- Updated session handling to hide cron run alias session keys from the sessions list, improving clarity.
- Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution.
- Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers.
These changes aim to improve the usability and reliability of session and cron job management.
* feat: implement job running state checks in cron service
- Added functionality to prevent manual job runs if a job is already in progress, enhancing job management.
- Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling.
- Enhanced the `run` function to return a specific reason when a job is already running.
- Introduced a new test case to verify the behavior of forced manual runs during active job execution.
These changes aim to improve the reliability and clarity of cron job execution and management.
* feat: add session ID and key to CronRunLogEntry model
- Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information.
- Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization.
These changes aim to improve the granularity of logging and session management within the cron job system.
* fix: improve session display name resolution
- Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present.
- Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming.
These changes aim to enhance the accuracy and usability of session display names in the UI.
* perf: skip cron store persist when idle timer tick produces no changes
recomputeNextRuns now returns a boolean indicating whether any job
state was mutated. The idle path in onTimer only persists when the
return value is true, eliminating unnecessary file writes every 60s
for far-future or idle schedules.
* fix: prep for merge - explicit delivery mode migration, docs + changelog (#10776) (thanks @tyler6204)
* Docs: fix broken /plugins links (#9308)
* Docs: fix broken /plugins links to /plugin
The documentation linked to /plugins which doesn't exist.
The correct path is /plugin (singular) which contains the
plugins overview documentation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: drop manual zh-CN doc edits from plugins link fix
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
* fix(build): unblock pnpm build dts
* Fix repository links in formal-verification.md (#10200)
Updated repository links for formal verification models.
* Revert previous change from 'Clawdbot' to 'OpenClaw' in lore (#9119)
* fix(memory): add input_type to Voyage AI embeddings for improved retrieval (#10818)
* fix(memory): add input_type to Voyage AI embeddings for improved retrieval
Voyage AI recommends passing input_type='document' when indexing and
input_type='query' when searching. This improves retrieval quality by
optimising the embedding space for each direction.
Changes:
- embedQuery now passes input_type: 'query'
- embedBatch now passes input_type: 'document'
- Batch API request_params includes input_type: 'document'
- Tests updated to verify input_type is passed correctly
* Changelog: note Voyage embeddings input_type fix (#10818) (thanks @mcinteerj)
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
* fix(dashboard): restore tokenized control ui links
* chore(skills): remove bird skill
* chore(onboard): move xAI up in auth list
* chore(release): 2026.2.6-1
* chore(onboard): move xAI below Google
* ci: add concurrency controls, consolidate macOS jobs, optimize Windows CI
* ci: re-enable parallel vitest on Windows CI
* docs(changelog): note CI pipeline optimization (#10784) (thanks @mcaxtr)
* fix(build): support daemon-cli .mjs bundles in compat shim
* fix(docker): support .mjs entrypoints in images and e2e
* test(hooks): stabilize session-memory hook tests
* chore(release): 2026.2.6-2
* chore(onboard): reorder xAI + Qianfan providers
* chore(release): 2026.2.6-3
* fix: comprehensive BlueBubbles and channel cleanup (#11093)
* feat(bluebubbles): auto-strip markdown from outbound messages (#7402)
* fix(security): add timeout to webhook body reading (#6762)
Adds 30-second timeout to readBody() in voice-call, bluebubbles, and nostr
webhook handlers. Prevents Slow-Loris DoS (CWE-400, CVSS 7.5).
Merged with existing maxBytes protection in voice-call.
* fix(security): unify Error objects and lint fixes in webhook timeouts (#6762)
* fix: prevent plugins from auto-enabling without user consent (#3961)
Changes default plugin enabled state from true to false in enablePluginEntry().
Preserves existing enabled:true values. Fixes #3932.
* fix: apply hierarchical mediaMaxMb config to all channels (#8749)
Generalizes resolveAttachmentMaxBytes() to use account → channel → global
config resolution for all channels, not just BlueBubbles. Fixes #7847.
* fix(bluebubbles): sanitize attachment filenames against header injection (#10333)
Strip ", \r, \n, and \\ from filenames after path.basename() to prevent
multipart Content-Disposition header injection (CWE-93, CVSS 5.4).
Also adds sanitization to setGroupIconBlueBubbles which had zero filename
sanitization.
* fix(lint): exclude extensions/ from Oxlint preflight check (#9313)
Extensions use PluginRuntime|null patterns that trigger
no-redundant-type-constituents because PluginRuntime resolves to any.
Excluding extensions/ from Oxlint unblocks user upgrades.
Re-applies the approach from closed PR #10087.
* fix(bluebubbles): add tempGuid to createNewChatWithMessage payload (#7745)
Non-Private-API mode (AppleScript) requires tempGuid in send payloads.
The main sendMessageBlueBubbles already had it, but createNewChatWithMessage
was missing it, causing 400 errors for new chat creation without Private API.
* fix: send stop-typing signal when run ends with NO_REPLY (#8785)
Adds onCleanup callback to the typing controller that fires when the
controller is cleaned up while typing was active (e.g., after NO_REPLY).
Channels using createTypingCallbacks automatically get stop-typing on
cleanup. This prevents the typing indicator from lingering in group chats
when the agent decides not to reply.
* fix(telegram): deduplicate skill commands in multi-agent setup (#5717)
Two fixes:
1. Skip duplicate workspace dirs when listing skill commands across agents.
Multiple agents sharing the same workspace would produce duplicate commands
with _2, _3 suffixes.
2. Clear stale commands via deleteMyCommands before registering new ones.
Commands from deleted skills now get cleaned up on restart.
* fix: add size limits to unbounded in-memory caches (#4948)
Adds max-size caps with oldest-entry eviction to prevent OOM in
long-running deployments:
- BlueBubbles serverInfoCache: 64 entries (already has TTL)
- Google Chat authCache: 32 entries
- Matrix directRoomCache: 1024 entries
- Discord presenceCache: 5000 entries per account
* fix: address review concerns (#11093)
- Chain deleteMyCommands → setMyCommands to prevent race condition (#5717)
- Rename enablePluginEntry to registerPluginEntry (now sets enabled: false)
- Add Slow-Loris timeout test for readJsonBody (#6023)
* docs: add symptom-first troubleshooting hub and deep runbooks (#11196)
* docs(troubleshooting): add symptom-first troubleshooting runbooks
* docs(troubleshooting): fix approvals command examples
* docs(troubleshooting): wrap symptom cases in accordions
* docs(automation): clarify userTimezone missing-key behavior
* docs(troubleshooting): fix first-60-seconds ladder order
* docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list (#8105)
* docs: add missing HEARTBEAT.md and MEMORY.md to bootstrap files list
Fixes #7928
The documentation for skipBootstrap and workspace setup was missing
HEARTBEAT.md and MEMORY.md from the bootstrap files list.
Changes:
- docs/gateway/configuration.md: Add HEARTBEAT.md and MEMORY.md
- docs/zh-CN/gateway/configuration.md: Same for Chinese version
- docs/start/openclaw.md: Add HEARTBEAT.md, clarify MEMORY.md is optional
- docs/zh-CN/start/openclaw.md: Same for Chinese version
* fix: reference PR number instead of issue in CHANGELOG
* docs(workspace): align bootstrap file docs with runtime (#8105)
---------
Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
* Agents: include runtime shell (#1835)
* Agents: include runtime shell
* Agents: fix compact runtime build
* chore: fix CLAUDE.md formatting, security regex for secret
---------
Co-authored-by: Tak hoffman <takayukihoffman@gmail.com>
Co-authored-by: quotentiroler <max.nussbaumer@maxhealth.tech>
* Web UI: show Compaction divider in chat history (#11341)
* adding PR review workflow
* added more explicit instructions
* docs: canonicalize docs paths and align zh navigation (#11428)
* docs(navigation): canonicalize paths and align zh nav
* chore(docs): remove stray .DS_Store
* docs(scripts): add non-mint docs link audit
* docs(nav): fix zh source paths and preserve legacy redirects (#11428) (thanks @sebslight)
* chore(docs): satisfy lint for docs link audit script (#11428) (thanks @sebslight)
* chore: bump pi to 0.52.8
* Fix typo in FAQ regarding model configuration command (#6048)
* CI: skip heavy jobs on docs-only changes (#11328)
* fix: add .caf to AUDIO_FILE_EXTENSIONS (#10982)
* fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages
* fix: add caf audio extension regression coverage (#10982) (thanks @succ985)
---------
Co-authored-by: succ985 <succ985@users.noreply.github.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* Gateway: fix multi-agent sessions.usage discovery (#11523)
* Gateway: fix multi-agent sessions.usage discovery
* Gateway: resolve sessions.usage keys via sessionId
* feat(gateway): add agents.create/update/delete methods (#11045)
* feat(gateway): add agents.create/update/delete methods
* fix(lint): preserve memory-lancedb load error cause
* feat(gateway): trash agent files on agents.delete
* chore(protocol): regenerate Swift gateway models
* fix(gateway): stabilize agents.create dirs and agentDir
* feat(gateway): support avatar in agents.create
* fix: prep agents.create/update/delete handlers (#11045) (thanks @advaitpaliwal)
- Reuse movePathToTrash from browser/trash.ts (has ~/.Trash fallback on non-macOS)
- Fix partial-failure: workspace setup now runs before config write
- Always write Name to IDENTITY.md regardless of emoji/avatar
- Add unit tests for agents.create, agents.update, agents.delete
- Add CHANGELOG entry
---------
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
* feat(sanitize): enhance context overflow error handling in user-facing text
- Added tests to ensure proper sanitization of context overflow errors.
- Introduced a new function to determine when to rewrite context overflow messages.
- Updated the sanitization logic to improve user experience by providing clearer error messages while preserving conversational context.
* fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (#11448)
* fix(gateway): use LAN IP for WebSocket/probe URLs when bind=lan (#11329)
When gateway.bind=lan, the HTTP server correctly binds to 0.0.0.0
(all interfaces), but WebSocket connection URLs, probe targets, and
Control UI links were hardcoded to 127.0.0.1. This caused CLI commands
and status probes to show localhost-only URLs even in LAN mode, and
made onboarding display misleading connection info.
- Add pickPrimaryLanIPv4() to gateway/net.ts to detect the machine's
primary LAN IPv4 address (prefers en0/eth0, falls back to any
external interface)
- Update pickProbeHostForBind() to use LAN IP when bind=lan
- Update buildGatewayConnectionDetails() to use LAN IP and report
"local lan <ip>" as the URL source
- Update resolveControlUiLinks() to return LAN-accessible URLs
- Update probe note in status.gather.ts to reflect new behavior
- Add tests for pickPrimaryLanIPv4 and bind=lan URL resolution
Closes #11329
Co-authored-by: Cursor <cursoragent@cursor.com>
* test: move vi.restoreAllMocks to afterEach in pickPrimaryLanIPv4
Per review feedback: avoid calling vi.restoreAllMocks() inside
individual tests as it restores all spies globally and can cause
ordering issues. Use afterEach in the describe block instead.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Changelog: note LAN bind URLs fix (#11448) (thanks @AnonO6)
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
* fix: recover from context overflow caused by oversized tool results (#11579)
* fix: gracefully handle oversized tool results causing context overflow
When a subagent reads a very large file or gets a huge tool result (e.g.,
gh pr diff on a massive PR), it can exceed the model's context window in
a single prompt. Auto-compaction can't help because there's no older
history to compact — just one giant tool result.
This adds two layers of defense:
1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens)
applied in the session tool result guard before persistence. This
prevents extremely large tool results from being stored in full,
regardless of model context window size.
2. Recovery: When context overflow is detected and compaction fails,
scan session messages for oversized tool results relative to the
model's actual context window (30% max share). If found, truncate
them in the session via branching (creating a new branch with
truncated content) and retry the prompt.
The truncation preserves the beginning of the content (most useful for
understanding what was read) and appends a notice explaining the
truncation and suggesting offset/limit parameters for targeted reads.
Includes comprehensive tests for:
- Text truncation with newline-boundary awareness
- Context-window-proportional size calculation
- In-memory message truncation
- Oversized detection heuristics
- Guard-level size capping during persistence
* fix: prep fixes for tool result truncation PR (#11579) (thanks @tyler6204)
* Memory: harden QMD startup, timeouts, and fallback recovery
* Memory: queue forced QMD sync and handle sqlite busy reads
* Memory: chain forced QMD queue and fail over on busy index
* Memory: make QMD cache eviction callback idempotent
* Memory: add SQLITE_BUSY fallback regression test
* Update CHANGELOG.md for version 2026.2.6-4: Added RPC methods for agent management, fixed context overflow recovery, improved LAN IP handling, enhanced memory retrieval, and updated media understanding for audio transcription.
* Tests: harden flake hotspots and consolidate provider-auth suites (#11598)
* Tests: harden flake hotspots and consolidate provider-auth suites
* Tests: restore env vars by deleting missing snapshot values
* Tests: use real newline in memory summary filter case
* Tests(memory): use fake timers for qmd timeout coverage
* Changelog: add tests hardening entry for #11598
* docs: clarify onboarding instructions for beginners (#10956)
* chore: updated PR review skills and workflow info on tests + fake timers
* Fix Nix repository link in README (#7910)
Updated Nix repository link in README.
Co-authored-by: Josh <141778+bolapara@users.noreply.github.com>
Co-authored-by: Seb Slight <19554889+sebslight@users.noreply.github.com>
* Docs: fix cron.update param name id → jobId (#11365) (#11467)
* Docs: fix cron.update param name id → jobId (#11365)
* Docs: sync zh-CN cron.update param name id → jobId
* docs: revert manual zh-CN generated docs edit (#11467) (thanks @lailoo)
---------
Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Sebastian <19554889+sebslight@users.noreply.github.com>
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas (#4824)
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas
device-identity.ts and canvas-host/server.ts used hardcoded
path.join(os.homedir(), '.openclaw', ...) ignoring OPENCLAW_STATE_DIR
env var and the resolveStateDir() logic from config/paths.ts.
This caused ~/.openclaw/identity and ~/.openclaw/canvas directories
to be created even when state dir was overridden or resided elsewhere.
* fix: format and remove duplicate imports
* fix: scope state-dir patch + add regression tests (#4824) (thanks @kossoy)
* fix: align state-dir fallbacks in hooks and agent paths (#4824) (thanks @kossoy)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* fix(cron): share isolated announce flow + harden cron scheduling/delivery (#11641)
* fix(cron): comprehensive cron scheduling and delivery fixes
- Fix delivery target resolution for isolated agent cron jobs
- Improve schedule parsing and validation
- Add job retry logic and error handling
- Enhance cron ops with better state management
- Add timer improvements for more reliable cron execution
- Add cron event type to protocol schema
- Support cron events in heartbeat runner (skip empty-heartbeat check,
use dedicated CRON_EVENT_PROMPT for relay)
* fix: remove cron debug test and add changelog/docs notes (#11641) (thanks @tyler6204)
* fix: context overflow compaction and subagent announce improvements (#11664) (thanks @tyler6204)
* initial commit
* feat: implement deriveSessionTotalTokens function and update usage tests
* Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens.
* Updated usage tests to include cases for derived session total tokens.
* Refactored session usage calculations in multiple files to utilize the new function for improved accuracy.
* fix: restore overflow truncation fallback + changelog/test hardening (#11551) (thanks @tyler6204)
* fix(ui): smooth chat refresh scroll and suppress new-messages badge flash
* fix(discord): support forum channel thread-create (#10062)
* fix(discord): support forum channel thread-create
* fix: harden discord forum thread-create (#10062) (thanks @jarvis89757)
---------
Co-authored-by: Shakker <shakkerdroid@gmail.com>
* feat(telegram): add spoiler tag support (#11543)
* feat(telegram): add spoiler tag support
Render markdown ||spoiler|| syntax as <tg-spoiler> tags in Telegram HTML output.
The markdown IR already parses spoiler syntax, but the Telegram renderer was
missing the style marker. This adds the spoiler marker to renderTel…
heybeaux
pushed a commit
to heybeaux/openclaw
that referenced
this pull request
Feb 12, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 16, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
maxtongwang
added a commit
to maxtongwang/openclaw
that referenced
this pull request
Feb 19, 2026
* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set (#7178)
* fix(control-ui): resolve header logo when gateway.controlUi.basePath is set
* refactor(control-ui): header logo under basePath; normalize logo URL with normalizeBasePath
* docs: add changelog for #7178 (thanks @Yeom-JinHo)
* docs: document secure DM mode preset (#7872)
* docs: document secure DM mode preset
* fix: resolve merge conflict in resizable-divider
* fix(security): separate untrusted channel metadata from system prompt (thanks @KonstantinMirin)
* docs: update Feishu plugin docs
* feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)
* feat: add docs chat prototype and related scripts
- Introduced a minimal documentation chatbot that builds a search index from markdown files and serves responses via an API.
- Added scripts for building the index and serving the chat API.
- Updated package.json with new commands for chat index building and serving.
- Created a new Vercel configuration file for deployment.
- Added a README for the docs chat prototype detailing usage and integration.
* feat: enhance docs chat with vector-based RAG pipeline
- Added vector index building and serving capabilities to the docs chat.
- Introduced new scripts for generating embeddings and serving the chat API using vector search.
- Updated package.json with new commands for vector index operations.
- Enhanced README with instructions for the new RAG pipeline and legacy keyword pipeline.
- Removed outdated Vercel configuration file.
* feat: enhance chat widget with markdown rendering and style updates
- Integrated dynamic loading of markdown rendering for chat responses.
- Implemented a fallback for markdown rendering to ensure consistent display.
- Updated CSS variables for improved theming and visual consistency.
- Enhanced chat bubble and input styles for better user experience.
- Added new styles for markdown content in chat bubbles, including code blocks and lists.
* feat: add copy buttons to chat widget for enhanced user interaction
- Implemented copy buttons for chat responses and code blocks in the chat widget.
- Updated CSS styles for improved visibility and interaction of copy buttons.
- Adjusted textarea height for better user experience.
- Enhanced functionality to allow users to easily copy text from chat bubbles and code snippets.
* feat: update chat widget styles for improved user experience
- Changed accent color for better visibility.
- Enhanced preformatted text styles for code blocks, including padding and word wrapping.
- Adjusted positioning and styles of copy buttons for chat responses and code snippets.
- Improved hover effects for copy buttons to enhance interactivity.
* feat: enhance chat widget styles for better responsiveness and scrollbar design
- Updated chat panel dimensions for improved adaptability on various screen sizes.
- Added custom scrollbar styles for better aesthetics and usability.
- Adjusted chat bubble styles for enhanced visibility and interaction.
- Improved layout for expanded chat widget on smaller screens.
* feat: refine chat widget code block styles and copy button functionality
- Adjusted padding and margin for preformatted text in chat responses for better visual consistency.
- Introduced a compact style for single-line code blocks to enhance layout.
- Updated copy button logic to skip short code blocks, improving user experience when copying code snippets.
* feat: add resize handle functionality to chat widget for adjustable panel width
- Implemented a draggable resize handle for the chat widget's sidebar, allowing users to adjust the panel width.
- Added CSS styles for the resize handle, including hover effects and responsive behavior.
- Integrated drag-to-resize logic to maintain user-set width across interactions.
- Ensured the panel resets to default width when closed, enhancing user experience.
* feat: implement rate limiting and error handling in chat API
- Added rate limiting functionality to the chat API, allowing a maximum number of requests per IP within a specified time window.
- Implemented error handling for rate limit exceeded responses, including appropriate headers and retry instructions.
- Enhanced error handling for other API errors, providing user-friendly messages for various failure scenarios.
- Updated README to include new environment variables for rate limiting configuration.
* feat: integrate Upstash Vector for enhanced document retrieval in chat API
- Implemented Upstash Vector as a cloud-based storage solution for document chunks, replacing the local LanceDB option.
- Added auto-detection of storage mode based on environment variables for seamless integration.
- Updated the chat API to utilize the new retrieval mechanism, enhancing response accuracy and performance.
- Enhanced README with setup instructions for Upstash and updated environment variable requirements.
- Introduced new scripts and configurations for managing the vector index and API interactions.
* feat: add create-markdown-preview.js for markdown rendering
- Introduced a new script for framework-agnostic HTML rendering of markdown content.
- The script includes various parsing functions to handle different markdown elements.
- Updated the chat widget to load the vendored version of @create-markdown/preview for improved markdown rendering.
* docs: update README for Upstash Vector index setup and environment variables
- Enhanced instructions for creating a Vector index in Upstash, including detailed settings and important notes.
- Clarified environment variable requirements for both Upstash and LanceDB modes.
- Improved formatting and organization of setup steps for better readability.
- Added health check and API endpoint details for clearer usage guidance.
* feat: add TRUST_PROXY environment variable for IP address handling
- Introduced the TRUST_PROXY variable to control the trust of X-Forwarded-For headers when behind a reverse proxy.
- Updated the README to document the new environment variable and its default value.
- Enhanced the getClientIP function to conditionally trust proxy headers based on the TRUST_PROXY setting.
* feat: add ALLOWED_ORIGINS environment variable for CORS configuration
- Introduced the ALLOWED_ORIGINS variable to specify allowed origins for CORS, enhancing security and flexibility.
- Updated the README to document the new environment variable and its usage.
- Refactored CORS handling in the server code to utilize the ALLOWED_ORIGINS setting for dynamic origin control.
* fix: ensure complete markdown rendering in chat widget
- Added logic to flush any remaining buffered bytes from the decoder, ensuring that all text is rendered correctly in the assistant bubble.
- Updated the assistant bubble's innerHTML to reflect the complete markdown content after streaming completes.
* feat: enhance DocsStore with improved vector handling and similarity conversion
- Added a constant for the distance metric used in vector searches, clarifying the assumption of L2 distance.
- Updated the createTable method to ensure all chunk properties are correctly mapped during table creation.
- Improved the similarity score calculation by providing a clear explanation of the conversion from L2 distance, ensuring accurate ranking of results.
* chore: fix code formatting
* Revert "chore: fix code formatting"
This reverts commit 6721f5b0b7bf60b76c519ccadfa41742f19ecf87.
* chore: format code for improved readability
- Reformatted code in serve.ts to enhance readability by adjusting indentation and line breaks.
- Ensured consistent style for function return types and object properties throughout the file.
* feat: Update API URL selection logic in chat widget
- Enhanced the API URL configuration to prioritize explicit settings, defaulting to localhost for development and using a production URL otherwise.
- Improved clarity in the code by adding comments to explain the logic behind the API URL selection.
* chore: Update documentation structure for improved organization
- Changed the path for the "Start Here" page to "start/index" for better clarity.
- Reformatted the "Web & Interfaces" and "Help" groups to use multi-line arrays for improved readability.
* feat: Enhance markdown preview integration and improve chat widget asset loading
- Wrapped the markdown preview functionality in an IIFE to expose a global API for easier integration.
- Updated the chat widget to load the markdown preview library dynamically, checking for existing instances to avoid duplicate loads.
- Adjusted asset paths in the chat widget to ensure correct loading based on the environment (local or production).
- Added CORS headers in the Vercel configuration for improved API accessibility.
* fix: Update chat API URL to include '/api' for correct endpoint access
- Modified the chat configuration and widget files to append '/api' to the API URL, ensuring proper endpoint usage in production and local environments.
* refactor: Simplify docs-chat configuration and remove unused scripts
- Removed outdated scripts and configurations related to the docs-chat feature, including build and serve scripts, as well as the associated package.json and README files.
- Streamlined the API URL configuration in the chat widget for better clarity and maintainability.
- Updated the package.json to remove unnecessary scripts related to the now-deleted functionality.
* refactor: Update documentation structure for improved clarity
- Changed the path for the "Start Here" page from "start/index" to "index" to enhance navigation and organization within the documentation.
* chore: Remove unused dependencies from package.json and pnpm-lock.yaml
- Deleted `@lancedb/lancedb`, `@upstash/vector`, and `openai` from both package.json and pnpm-lock.yaml to streamline the project and reduce bloat.
* chore: Clean up .gitignore by removing obsolete entries
- Deleted unused entries related to the docs-chat vector database from .gitignore to maintain a cleaner configuration.
* chore: Remove deprecated chat configuration and markdown preview script
- Deleted the `create-markdown-preview.js` script and the `docs-chat-config.js` file to eliminate unused assets and streamline the project.
- Updated the `docs-chat-widget.js` to directly reference the markdown library from a CDN, enhancing maintainability.
* chore: Update markdown rendering in chat widget to use marked library
- Replaced the deprecated `create-markdown-preview` library with the `marked` library for markdown rendering.
- Adjusted the script loading mechanism to fetch `marked` from a CDN, improving performance and maintainability.
- Enhanced the markdown rendering function to ensure security by disabling HTML pass-through and opening links in new tabs.
* Delete docs/start/index.md
* fix: harden voice-call webhook verification
* fix(cron): fix timeout, add timestamp validation, enable file sync
Fixes #7667
Task 1: Fix cron operation timeouts
- Increase default gateway tool timeout from 10s to 30s
- Increase cron-specific tool timeout to 60s
- Increase CLI default timeout from 10s to 30s
- Prevents timeouts when gateway is busy with long-running jobs
Task 2: Add timestamp validation
- New validateScheduleTimestamp() function in validate-timestamp.ts
- Rejects atMs timestamps more than 1 minute in the past
- Rejects atMs timestamps more than 10 years in the future
- Applied to both cron.add and cron.update operations
- Provides helpful error messages with current time and offset
Task 3: Enable file sync for manual edits
- Track file modification time (storeFileMtimeMs) in CronServiceState
- Check file mtime in ensureLoaded() and reload if changed
- Recompute next runs after reload to maintain accuracy
- Update mtime after persist() to prevent reload loop
- Dashboard now picks up manual edits to ~/.openclaw/cron/jobs.json
* feat(cron): introduce delivery modes for isolated jobs
- Added support for new delivery modes in cron jobs: `announce`, `deliver`, and `none`.
- Updated documentation to reflect changes in delivery options and usage examples.
- Enhanced the cron job schema to include delivery configuration.
- Refactored related CLI commands and UI components to accommodate the new delivery settings.
- Improved handling of legacy delivery fields for backward compatibility.
This update allows users to choose how output from isolated jobs is delivered, enhancing flexibility in job management.
* feat(cron): default isolated jobs to announce delivery and enhance scheduling options
- Updated isolated cron jobs to default to `announce` delivery mode, improving user experience.
- Enhanced scheduling options to accept ISO 8601 timestamps for `schedule.at`, while still supporting epoch milliseconds.
- Refined documentation to clarify delivery modes and scheduling formats.
- Adjusted related CLI commands and UI components to reflect these changes, ensuring consistency across the platform.
- Improved handling of legacy delivery fields for backward compatibility.
This update streamlines the configuration of isolated jobs, making it easier for users to manage job outputs and schedules.
* feat(cron): enhance one-shot job behavior and CLI options
- Default one-shot jobs to delete after success, improving job management.
- Introduced `--keep-after-run` CLI option to allow users to retain one-shot jobs post-execution.
- Updated documentation to clarify default behaviors and new options for one-shot jobs.
- Adjusted cron job creation logic to ensure consistent handling of delete options.
- Enhanced tests to validate new behaviors and ensure reliability.
This update streamlines the handling of one-shot jobs, providing users with more control over job persistence and execution outcomes.
* feat(cron): enhance delivery modes and job configuration
- Updated isolated cron jobs to support new delivery modes: `announce` and `none`, improving output management.
- Refactored job configuration to remove legacy fields and streamline delivery settings.
- Enhanced the `CronJobEditor` UI to reflect changes in delivery options, including a new segmented control for delivery mode selection.
- Updated documentation to clarify the new delivery configurations and their implications for job execution.
- Improved tests to validate the new delivery behavior and ensure backward compatibility with legacy settings.
This update provides users with greater flexibility in managing how isolated jobs deliver their outputs, enhancing overall usability and clarity in job configurations.
* feat(cron): set default enabled state for cron jobs
- Added logic to default the `enabled` property to `true` if not explicitly set as a boolean in the cron job input.
- Updated job creation and store functions to ensure consistent handling of the `enabled` state across the application.
- Enhanced input normalization to improve job configuration reliability.
This update ensures that cron jobs are enabled by default, enhancing user experience and reducing potential misconfigurations.
* refactor(cron): update delivery instructions for isolated agent
- Revised the delivery instructions in the isolated agent's command body to clarify that summaries should be returned as plain text and will be delivered by the main agent.
- Removed the previous directive regarding messaging tools to streamline communication guidelines.
This change enhances clarity in the delivery process for isolated agent tasks.
* feat(cron): enhance delivery handling and testing for isolated jobs
- Introduced new properties for explicit message targeting and message tool disabling in the EmbeddedRunAttemptParams type.
- Updated cron job tests to validate best-effort delivery behavior and handling of delivery failures.
- Added logic to clear delivery settings when switching session targets in cron jobs.
- Improved the resolution of delivery failures and best-effort logic in the isolated agent's run function.
This update enhances the flexibility and reliability of delivery mechanisms in isolated cron jobs, ensuring better handling of message delivery scenarios.
* refactor(cron): improve delivery configuration handling in CronJobEditor and CLI
- Enhanced the delivery configuration logic in CronJobEditor to explicitly set the bestEffort property based on job settings.
- Refactored the CLI command to streamline delivery object creation, ensuring proper handling of optional fields like channel and to.
- Improved code readability and maintainability by restructuring delivery assignment logic.
This update clarifies the delivery configuration process, enhancing the reliability of job settings in both the editor and CLI.
* feat(cron): enhance legacy delivery handling in job patches
- Introduced logic to map legacy payload delivery updates onto the delivery object for `agentTurn` jobs, ensuring backward compatibility with legacy clients.
- Added tests to validate the correct application of legacy delivery settings in job patches, improving reliability in job configuration.
- Refactored delivery handling functions to streamline the merging of legacy delivery fields into the current job structure.
This update enhances the flexibility of delivery configurations, ensuring that legacy settings are properly handled in the context of new job patches.
* fix(cron): fix test failures and regenerate protocol files
- Add forceReload option to ensureLoaded to avoid stat I/O in normal
paths while still detecting cross-service writes in the timer path
- Post isolated job summary back to main session (restores the old
isolation.postToMainPrefix behavior via delivery model)
- Update legacy migration tests to check delivery.channel instead of
payload.channel (normalization now moves delivery fields to top-level)
- Remove legacy deliver/channel/to/bestEffortDeliver from payload schema
- Update protocol conformance test for delivery modes
- Regenerate GatewayModels.swift (isolation -> delivery)
* UI: handle future timestamps in formatAgo
* Changelog: move cron entries to 2026.2.3
* fix: cron announce delivery path (#8540) (thanks @tyler6204)
* Telegram: use Grammy types directly, add typed Probe/Audit to plugin interface (#8403)
* Telegram: replace duplicated types with Grammy imports, add Probe/Audit generics to plugin interface
* Telegram: remove legacy forward metadata (deprecated in Bot API 7.0), simplify required-field checks
* Telegram: clean up remaining legacy references and unnecessary casts
* Telegram: keep RequestInit parameter type in proxy fetch (addresses review feedback)
* Telegram: add exhaustiveness guard to resolveForwardOrigin switch
* fix(telegram): include forward_from_chat metadata in forwarded message context (#8133)
Extract missing metadata from forwarded Telegram messages:
- Add fromChatType to TelegramForwardedContext, capturing the original
chat type (channel/supergroup/group) from forward_from_chat.type
and forward_origin.chat/sender_chat.type
- Add fromMessageId to capture the original message ID from channel forwards
- Read author_signature from forward_origin objects (modern API),
preferring it over the deprecated forward_signature field
- Pass ForwardedFromChatType and ForwardedFromMessageId through to
the inbound context payload
- Add test coverage for forward_origin channel/chat types, including
author_signature extraction and fromChatType propagation
* fix: trim legacy signature fallback, type fromChatType as union
* fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg)
* fix(imessage): unify timeout configuration with configurable probeTimeoutMs
- Add probeTimeoutMs config option to channels.imessage
- Export DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS constant (10s) from probe.ts
- Propagate timeout config through all iMessage probe/RPC operations
- Fix hardcoded 2000ms timeouts that were too short for SSH connections
Closes: timeout issues when using SSH wrapper scripts (imsg-ssh)
* fix: address review comments
- Use optional timeoutMs parameter (undefined = use config/default)
- Extract DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS to shared constants.ts
- Import constant in client.ts instead of hardcoding
- Re-export constant from probe.ts for backwards compatibility
* fix(imessage): detect self-chat echoes to prevent infinite loops (#8680)
* fix: align proxy fetch typing
* feat: add cloudflare ai gateway provider
* fix: force reload cron store
* Revert "feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)" (#8834)
This reverts commit fa4b28d7af7464b07271bfef6c028e4135548f44.
* fix(web ui): agent model selection
* Docs: landing page revamp (#8885)
* Docs: refresh landing page
* Docs: add landing page companion pages
* Docs: drop legacy Jekyll assets
* Docs: remove legacy terminal css test
* Docs: restore terminal css assets
* Docs: remove terminal css assets
* fix(app-render): handle optional model in renderApp function
* chore: replace landpr prompt with end-to-end landing workflow (#8916)
* 🤖 docs: mirror landing revamp for zh-CN
What:
- add zh-CN versions of landing revamp pages (features, quickstart, docs directory, network model, credits)
- refresh zh-CN index and hubs, plus glossary entries
Why:
- keep Chinese docs aligned with the new English landing experience
- ensure navigation surfaces the new entry points
Tests:
- pnpm build && pnpm check && pnpm test
* 🤖 docs: note zh-CN landing revamp (#8994) (thanks @joshp123)
What:
- add changelog entry for the zh-CN landing revamp docs
Why:
- record the doc update and thank the contributor
Tests:
- pnpm lint && pnpm build && pnpm test
* feat: add shell completion installation prompt to CLI update command
* feat: add shell completion test script for installation verification
* completion: export cache utilities and require cached file for installation
- Export `resolveCompletionCachePath` and `completionCacheExists` for external use
- Update `installCompletion` to require cache existence (never use slow dynamic pattern)
- Add `usesSlowDynamicCompletion` to detect old `source <(...)` patterns
- Add `getShellProfilePath` helper for consistent profile path resolution
- Update `formatCompletionSourceLine` to always use cached file
* doctor: add shell completion check module
- Add `checkShellCompletionStatus` to get profile/cache/slow-pattern status
- Add `ensureCompletionCacheExists` for silent cache regeneration
- Add `doctorShellCompletion` to check and fix completion issues:
- Auto-upgrade old slow dynamic patterns to cached version
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* doctor: integrate shell completion check into doctor command
- Import and call `doctorShellCompletion` during doctor run
- Checks/fixes completion issues before gateway health check
* update: use shared completion helpers for shell completion setup
- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during update
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* onboard: use shared completion helpers for shell completion setup
- Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists`
- Auto-upgrade old slow dynamic patterns silently during onboarding
- Auto-regenerate cache if profile exists but cache is missing
- Prompt to install if no completion is configured
* scripts: update test-shell-completion to use shared helpers
- Use `checkShellCompletionStatus` and `ensureCompletionCacheExists` from doctor-completion
- Display "Uses slow pattern" status in output
- Simulate doctor/update/onboard behavior for all completion scenarios
- Remove duplicated utility functions
* changelog: add shell completion auto-fix entry
* feat: per-channel responsePrefix override (#9001)
* feat: per-channel responsePrefix override
Add responsePrefix field to all channel config types and Zod schemas,
enabling per-channel and per-account outbound response prefix overrides.
Resolution cascade (most specific wins):
L1: channels.<ch>.accounts.<id>.responsePrefix
L2: channels.<ch>.responsePrefix
L3: (reserved for channels.defaults)
L4: messages.responsePrefix (existing global)
Semantics:
- undefined -> inherit from parent level
- empty string -> explicitly no prefix (stops cascade)
- "auto" -> derive [identity.name] from routed agent
Changes:
- Core logic: resolveResponsePrefix() in identity.ts accepts
optional channel/accountId and walks the cascade
- resolveEffectiveMessagesConfig() passes channel context through
- Types: responsePrefix added to WhatsApp, Telegram, Discord, Slack,
Signal, iMessage, Google Chat, MS Teams, Feishu, BlueBubbles configs
- Zod schemas: responsePrefix added for config validation
- All channel handlers wired: telegram, discord, slack, signal,
imessage, line, heartbeat runner, route-reply, native commands
- 23 new tests covering backward compat, channel/account levels,
full cascade, auto keyword, empty string stops, unknown fallthrough
Fully backward compatible - no existing config is affected.
Fixes #8857
* fix: address CI lint + review feedback
- Replace Record<string, any> with proper typed helpers (no-explicit-any)
- Add curly braces to single-line if returns (eslint curly)
- Fix JSDoc: 'Per-channel' → 'channel/account' on shared config types
- Extract getChannelConfig() helper for type-safe dynamic key access
* fix: finish responsePrefix overrides (#9001) (thanks @mudrii)
* fix: normalize prefix wiring and types (#9001) (thanks @mudrii)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* Discord: allow disabling thread starter context
* feat(heartbeat): add accountId config option for multi-agent routing (#8702)
* feat(heartbeat): add accountId config option for multi-agent routing
Add optional accountId field to heartbeat configuration, allowing
multi-agent setups to explicitly specify which Telegram account
should be used for heartbeat delivery.
Previously, heartbeat delivery would use the accountId from the
session's deliveryContext. When a session had no prior conversation
history, heartbeats would default to the first/primary account
instead of the agent's intended bot.
Changes:
- Add accountId to HeartbeatSchema (zod-schema.agent-runtime.ts)
- Use heartbeat.accountId with fallback to session accountId (targets.ts)
Backward compatible: if accountId is not specified, behavior is unchanged.
Closes #8695
* fix: improve heartbeat accountId routing (#8702) (thanks @lsh411)
* fix: harden heartbeat accountId routing (#8702) (thanks @lsh411)
* fix: expose heartbeat accountId in status (#8702) (thanks @lsh411)
* chore: format status + heartbeat tests (#8702) (thanks @lsh411)
---------
Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
* TUI/Gateway: fix pi streaming + tool routing + model display + msg updating (#8432)
* TUI/Gateway: fix pi streaming + tool routing
* Tests: clarify verbose tool output expectation
* fix: avoid seq gaps for targeted tool events (#8432) (thanks @gumadeiras)
* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)
* Telegram: remove @ts-nocheck from bot.ts and bot-message-dispatch.ts
- bot/types.ts: TelegramContext.me uses UserFromGetMe (Grammy) instead of manual inline type
- bot.ts: remove 6 unsafe casts (as any, as unknown, as object), use Grammy types directly
- bot.ts: remove dead message_thread_id access on reactions (not in Telegram Bot API)
- bot.ts: remove resolveThreadSessionKeys import (no longer needed for reactions)
- bot-message-dispatch.ts: replace ': any' with DispatchTelegramMessageParams type
- bot-message-dispatch.ts: add sticker.fileId guard before cache access
- bot.test.ts: update reaction tests, remove dead DM thread-reaction test
* Telegram: remove duplicate bot.catch handler (only the last one runs in Grammy)
* Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077)
* Security: Prevent gateway credential exfiltration via URL override (#9179)
* Gateway: require explicit auth for url overrides
* Gateway: scope credential blocking to non-local URLs only
Address review feedback: the previous fix blocked credential fallback for
ALL URL overrides, which was overly strict and could break workflows that
use --url to switch between loopback/tailnet without passing credentials.
Now credential fallback is only blocked for non-local URLs (public IPs,
external hostnames). Local addresses (127.0.0.1, localhost, private IPs
like 192.168.x.x, 10.x.x.x, tailnet 100.x.x.x) still get credential
fallback as before.
This maintains the security fix (preventing credential exfiltration to
attacker-controlled URLs) while preserving backward compatibility for
legitimate local URL overrides.
* Security: require explicit credentials for gateway url overrides (#8113) (thanks @victormier)
* Gateway: reuse explicit auth helper for url overrides (#8113) (thanks @victormier)
* Tests: format gateway chat test (#8113) (thanks @victormier)
* Tests: require explicit auth for gateway url overrides (#8113) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Tests: restore TUI gateway env
* Security: harden sandboxed media handling (#9182)
* Message: enforce sandbox for media param
* fix: harden sandboxed media handling (#8780) (thanks @victormier)
* chore: format message action runner (#8780) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Telegram: remove @ts-nocheck from bot-message.ts (#9180)
* Telegram: remove @ts-nocheck from bot-message.ts, type deps via Omit<BuildTelegramMessageContextParams>
* Telegram: widen allMedia to TelegramMediaRef[] so stickerMetadata flows through
* Telegram: remove @ts-nocheck from bot-message.ts (#9180)
* fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188)
* Security: owner-only tools + command auth hardening (#9202)
* Security: gate whatsapp_login by sender auth
* Security: treat undefined senderAuthorized as unauthorized (opt-in)
* fix: gate whatsapp_login to owner senders (#8768) (thanks @victormier)
* fix: add explicit owner allowlist for tools (#8768) (thanks @victormier)
* fix: normalize escaped newlines in send actions (#8768) (thanks @victormier)
---------
Co-authored-by: Victor Mier <victormier@gmail.com>
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Telegram: remove @ts-nocheck from bot-handlers.ts, use Grammy types directly, deduplicate StickerMetadata
* Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206)
* Message: clarify media schema + fix MEDIA newline
* fix: enforce owner allowlist for commands
* fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241)
* fix: infer --auth-choice from API key flags during non-interactive onboarding
When --anthropic-api-key (or other provider key flags) is passed without
an explicit --auth-choice, the auth choice defaults to "skip", silently
discarding the API key. This means the gateway starts without credentials
and fails on every inbound message with "No API key found for provider".
Add inferAuthChoiceFromFlags() to derive the correct auth choice from
whichever provider API key flag was supplied, so credentials are persisted
to auth-profiles.json as expected.
Fixes #8481
* fix: infer auth choice from API key flags (#8484) (thanks @f-trycua)
* refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua)
---------
Co-authored-by: f-trycua <f@trycua.com>
* chore: sync plugin versions to 2026.2.3
* fix(mac): resolve cron schedule formatters
* chore(mac): update appcast for 2026.2.3
* chore: update 2026.2.3 notes
* fix: gracefully downgrade xhigh thinking level in cron isolated agent (#9363)
When thinkingDefault is set to "xhigh" but the configured model does not
support it (e.g. Claude), the cron isolated-agent path throws a hard error
causing the job to fail. The interactive chat path already handles this by
silently downgrading to "high".
Apply the same graceful downgrade in the cron path: log a warning and
fall back to "high" instead of crashing.
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
* fix: restore discord owner hint from allowlists
* fix: remove unused cron import
* fix(cli): resolve bundled chrome extension path
* test(cli): use unique temp dir for extension install
* fix(cli): support bundled extension path in dist root
* style(cli): satisfy lint rules in extension path resolver
* fix: resolve bundled chrome extension assets (#8914) (thanks @kelvinCB)
* Tests: add test coverage for security/windows-acl.ts
Adds comprehensive unit tests for Windows ACL inspection utilities:
- resolveWindowsUserPrincipal: username resolution with fallback
- parseIcaclsOutput: icacls output parsing
- summarizeWindowsAcl: ACL entry classification (trusted/world/group)
- inspectWindowsAcl: async ACL inspection with mocked exec
- formatWindowsAclSummary: summary string formatting
- formatIcaclsResetCommand: reset command string generation
- createIcaclsResetCommand: structured reset command generation
All 26 tests passing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix: stabilize windows acl tests and command auth registry (#9335) (thanks @M00N7682)
* test: register discord plugin in allowlist test
* chore: bump version to 2026.2.4
* fix: resolve discord owner allowFrom matches
* fix(telegram): preserve DM topic threadId in deliveryContext
When receiving messages in Telegram DM topics (Topics in Private Chats),
the threadId was not saved in the session's deliveryContext, causing
replies to go to General chat instead of the topic.
Now we pass threadId to updateLastRoute for DM topics.
Fixes #8891
* test(telegram): add DM topic threadId deliveryContext test for #8891
Verifies that threadId is passed to updateLastRoute for DM topics.
Test fails on main branch, passes with the fix.
* fix: preserve telegram DM topic threadId (#9039) (thanks @lailoo)
* Update deps.
* chore: Typecheck test helper files.
* Docs: streamline start and install docs (#9648)
* docs(start): streamline getting started flow
* docs(nav): reorganize start and install sections
* docs(style): move custom css to style.css
* docs(navigation): align zh-CN ordering
* docs(navigation): localize zh-Hans labels
* docs(install): rename install overview page
* CLI: sort commands alphabetically in help output
Fixes #7964
Added sortSubcommands: true to configureHelp() to display
commands in alphabetical order when running 'openclaw --help'.
* fix: update changelog for help sorting (#8068) (thanks @deepsoumya617)
* docs(onboarding): add bootstrapping page (#9767)
* docs: fix onboarding rendering issues
* chore: reset appcast to 2026.2.3
* fix(telegram): pass parentPeer for forum topic binding inheritance (#9789)
Fixes #9545 and #9351.
When a message comes from a Telegram forum topic, the peer ID includes
the topic suffix (e.g., `-1001234567890:topic:99`). Users configure
bindings with the base group ID, which previously did not match.
This adds `parentPeer` to `resolveAgentRoute()` calls for forum groups,
enabling binding inheritance from the parent group to all topics.
- Extract `buildTelegramParentPeer()` helper in bot/helpers.ts
- Pass parentPeer in bot-message-context.ts, bot-handlers.ts,
bot-native-commands.ts, and bot.ts (reaction handler)
- Add tests for forum topic routing and topic precedence
* docs(onboarding): streamline CLI onboarding docs (#9830)
* fix: auto-inject Telegram forum topic threadId in message tool
When using Telegram DM topics (forum topics), messages sent via the
message tool (media, buttons, etc.) land in General Topic instead of
the user's current topic. This happens because Slack has
resolveSlackAutoThreadId for auto-threading but Telegram had no
equivalent.
Add resolveTelegramAutoThreadId that mirrors the Slack pattern:
- When channel is telegram and no explicit threadId is provided
- Check if toolContext.currentThreadTs (the topic ID) is set
- Verify the target matches the originating chat
- Inject the threadId into params so the Telegram plugin action
handler picks it up for sendMessage/sendMedia
The subagent announce path already correctly passes threadId via
requesterOrigin (set from agentThreadId in sessions-spawn-tool),
so no changes needed there.
* test: cover telegram topic threadId auto-injection and subagent origin threading
* fix: pass threadId/to/accountId from parent to subagent gateway call
When spawning a subagent, the requesterOrigin's threadId, to, and
accountId were not forwarded to the callGateway({method:'agent'}) params.
This meant the subagent's runContext had no currentThreadTs or
currentChannelId, so resolveTelegramAutoThreadId could not auto-inject
the forum topic thread ID when the subagent used the message tool.
Changes:
- sessions-spawn-tool: pass to, accountId, threadId from requesterOrigin
- run-context: populate currentChannelId from opts.to as fallback
Fixes subagent messages landing in General Topic instead of the correct
Telegram DM topic thread.
* fix: telegram topic auto-threading — use parseTelegramTarget, add tests (#7235) (thanks @Lukavyi)
* update handle
* docs: fix incorrect model.fallback to model.fallbacks in Ollama config (#9384) (#9749)
Both English and Chinese documentation had incorrect configuration template
using 'fallback' instead of 'fallbacks' in agents.defaults.model config.
Co-authored-by: damaozi <1811866786@qq.com>
* fix(cli): avoid NODE_OPTIONS for --disable-warning (#9691) (thanks @18-RAJAT)
Fixes npm pack failing on modern Node where --disable-warning is disallowed in NODE_OPTIONS.
* feat: add Claude Opus 4.6 to built-in model catalog (#9853)
* feat: add Claude Opus 4.6 to built-in model catalog
- Update default model from claude-opus-4-5 to claude-opus-4-6
- Add opus-4.6 model ID normalization
- Add claude-opus-4-6 to live model filter prefixes
- Update image tool to prefer claude-opus-4-6 for vision
- Add CLI backend alias for opus-4.6
- Update onboard auth default selections to include opus-4.6
- Update model picker placeholder
Closes #9811
* test: update tests for claude-opus-4-6 default
- Fix model-alias-defaults test to use claude-opus-4-6
- Fix image-tool test to expect claude-opus-4-6 in fallbacks
* feat: support claude-opus-4-6
* docs: update changelog for opus 4.6 (#9853) (thanks @TinyTb)
* chore: bump pi to 0.52.0
---------
Co-authored-by: Slurpy <slurpy@openclaw.ai>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* 🤖 Feishu: expand channel support
What:
- add post parsing, doc link extraction, routing, replies, reactions, typing, and user lookup
- fix media download/send flows and make doc fetches domain-aware
- update Feishu docs and clawtributor credits
Why:
- raise Feishu parity with other channels and avoid dropped group messages
- keep replies threaded while supporting Lark domains
- document new configuration and credit the contributor
Tests:
- pnpm build
- pnpm check
- pnpm test (gateway suite timed out; reran pnpm vitest run --config vitest.gateway.config.ts)
Co-authored-by: 九灵云 <server@jiulingyun.cn>
* 🤖 Feishu: tighten mention gating
What:
- require the bot open_id match for group mention detection when available
Why:
- prevent replies when other users are mentioned and the bot id is known
Tests:
- pnpm test
* fix: remove orphaned tool_results during compaction pruning
When pruneHistoryForContextShare drops chunks of messages, it could drop
an assistant message with tool_use blocks while leaving corresponding
tool_result messages in the kept portion. These orphaned tool_results
cause Anthropic's API to reject the session with 'unexpected tool_use_id'.
Fix by calling repairToolUseResultPairing after each chunk drop to clean
up any orphaned tool_results. This reuses existing battle-tested code
from session-transcript-repair.ts.
Fixes #9769, #9724, #9672
* fix cron scheduling and reminder delivery regressions (#9733)
* fix(cron): prevent timer from allowing process exit (fixes #9694)
The cron timer was using .unref(), which caused the Node.js event
loop to exit or sleep if no other handles were active. This prevented
cron jobs from firing in some environments.
* fix(cron): infer delivery target for isolated jobs (fixes #9683)
When creating isolated agentTurn jobs (e.g. reminders) without explicit
delivery options, the job would default to 'announce' but fail to
resolve the target conversation. Now, we infer the channel and
recipient from the agent's current session key.
* fix(cron): enhance delivery inference for threaded sessions and null inputs (#9733)
Improves the delivery inference logic in the cron tool to correctly handle threaded session keys and cases where delivery is explicitly set to null. This ensures that the appropriate delivery mode and target are inferred based on the agent's session key, enhancing the reliability of job execution.
* fix: preserve telegram topic delivery inference (#9733) (thanks @tyler6204)
* fix: simplify cron delivery merge spread (#9733) (thanks @tyler6204)
* chore: add agent credentials to gitignore (#9874)
Protect sensitive files from accidental commit:
- memory/ (moltbook credentials, session data)
- .agent/*.json (agent config, moltbook.json)
Workflows in .agent/workflows/ remain tracked.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Docs: escape hash symbol in help channel names in issue template (#9695)
* feat(skills): add QR code skill (#8817)
feat(skills): add QR code generation and reading skill
Adds qr-code skill with:
- qr_generate.py - Generate QR codes with customizable size/error correction
- qr_read.py - Decode QR codes from images
- SKILL.md documentation
Co-authored-by: Omar-Khaleel
* chore(agentsmd): add tsgo command to AGENTS.md (#9894)
Add `pnpm tsgo` command to AGENTS.md development reference
Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com>
* fix(runtime): bump minimum Node.js version to 22.12.0 (#5370)
* fix(runtime): bump minimum Node.js version to 22.12.0
Aligns the runtime guard with the declared package.json engines requirement.
The Matrix plugin (and potentially others) requires Node >= 22.12.0,
but the runtime guard previously allowed 22.0.0+. This caused confusing
errors like 'Cannot find module @vector-im/matrix-bot-sdk' when the real
issue was an unsupported Node version.
- Update MIN_NODE from 22.0.0 to 22.12.0
- Update error message to reflect the correct version
- Update tests to use 22.12.0 as the minimum valid version
Fixes #5292
* fix: update test versions to match MIN_NODE=22.12.0
---------
Co-authored-by: Markus Glucksberg <markus@glucksberg.com>
* fix: clear stale token metrics on /new and /reset (#8929)
When starting a new session via /new or /reset, the token usage fields
(totalTokens, inputTokens, outputTokens, contextTokens) survived from the
previous session via the spread pattern in session init. This caused /status
to display misleading context usage from the old session.
Clear all four token metrics explicitly in the isNewSession block, alongside
the existing compactionCount reset. Also add diagnostic logging for session
forking via ParentSessionKey to help trace context inheritance.
* chore: apply local workspace updates (#9911)
* chore: apply local workspace updates
* fix: resolve prep findings after rebase (#9898) (thanks @gumadeiras)
* refactor: centralize model allowlist normalization (#9898) (thanks @gumadeiras)
* fix: guard model allowlist initialization (#9911)
* docs: update changelog scope for #9911
* docs: remove model names from changelog entry (#9911)
* fix: satisfy type-aware lint in model allowlist (#9911)
* fix: allow multiple compaction retries on context overflow (#8928)
Previously, overflowCompactionAttempted was a boolean flag set once, preventing
recovery when a single compaction wasn't enough. Change to a counter allowing up
to 3 attempts before giving up. Also add diagnostic logging on overflow events to
help debug early-overflow issues.
Fixes sessions that hit context overflow during long agentic turns with many tool
calls, where one compaction round isn't sufficient to bring context below limits.
* fix(errors): show clear billing error instead of cryptic API response (#8391)
* fix(errors): return clear billing error message instead of cryptic raw error (#8136)
When an LLM API provider returns a credit/billing-related error (HTTP 402,
insufficient credits, low balance, etc.), OpenClaw now shows a clear,
actionable message instead of passing through the raw/cryptic error text:
⚠️ API provider returned a billing error — your API key has run out of
credits or has an insufficient balance. Check your provider's billing
dashboard and top up or switch to a different API key.
Changes:
- formatAssistantErrorText: detect billing errors via isBillingErrorMessage()
and return a user-friendly message (placed before the generic HTTP/JSON
error fallthrough)
- sanitizeUserFacingText: same billing detection for the sanitization path
- pi-embedded-runner/run.ts: add billingFailure detection in the profile
exhaustion fallback, so the FailoverError message is billing-specific
- Added 3 new tests for credit balance, HTTP 402, and insufficient credits
* fix: extract billing error message to shared constant
* Revert "feat(skills): add QR code skill (#8817)"
This reverts commit ad13c265ba1fd22dadfe30325ed998d9a3d95e5c.
* docs: improve DM security guidance with concrete example
Add a more prominent security warning for multi-user DM setups:
- Add blockquote security warning about context leakage
- Include concrete example showing the privacy risk
- Add "When to enable this" checklist
- Clarify that default is fine for single-user setups
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* docs: tighten secure DM example
* docs: note secure DM guidance update (#9377) (thanks @Shrinija17)
* Agents: bump pi-mono to 0.52.5 (#9949)
* Agents: bump pi-mono to 0.52.5
* Changelog: add PR reference for pi bump
* docs: restructure Get Started tab and improve onboarding flow (#9950)
* docs: restructure Get Started tab and improve onboarding flow
- Flatten nested Onboarding group into linear First Steps flow
- Add 'What is OpenClaw?' narrative section to landing page
- Split wizard.md into streamlined overview + full reference (reference/wizard.md)
- Move Pairing to Channels > Configuration
- Move Bootstrapping to Agents > Fundamentals
- Move macOS app onboarding to Platforms > macOS companion app
- Move Lore to Help > Community
- Remove duplicate install instructions from openclaw.md
- Mirror navigation changes in zh-CN tabs
- No content deleted — all detail preserved or relocated
* docs: move deployment pages to install/, fix Platforms tab routing, clarify onboarding paths
- Move deployment guides (fly, hetzner, gcp, macos-vm, exe-dev, railway, render,
northflank) from platforms/ and root to install/
- Add 'Hosting and deployment' group to Install tab
- Slim Gateway & Ops 'Remote access and deployment' down to 'Remote access'
- Swap Platforms tab before Gateway & Ops to fix path-prefix routing
- Move macOS app onboarding into First steps (parallel to CLI wizard)
- Rename sidebar titles to 'Onboarding: CLI' / 'Onboarding: macOS App'
- Add redirects for all moved paths
- Update all internal links (en + zh-CN)
- Fix img tag syntax in onboarding.md
* fix(telegram): accept messages from group members in allowlisted groups (#9775)
* fix(telegram): accept messages from group members in allowlisted groups
Issue #4559: Telegram bot was silently dropping messages from non-paired users
in allowlisted group chats due to overly strict sender filtering.
The fix adds a check to distinguish between:
1. Group itself is allowlisted → accept messages from any member
2. Group is NOT allowlisted → only accept from allowlisted senders
Changes:
- Check if group ID is in the allowlist (or allowlist is wildcard)
- Only reject sender if they're not in allowlist AND group is not allowlisted
- Improved logging to indicate the actual reason for rejection
This preserves security controls while fixing the UX issue where group members
couldn't participate unless individually allowlisted.
Backwards compatible: existing allowlists continue to work as before.
* style: format telegram fix for oxfmt compliance
* refactor(telegram): clarify group allowlist semantics in fix for #4559
Changes:
- Rename 'isGroupInAllowlist' to 'isGroupChatIdInAllowlist' for clarity
- Expand comments to explain the semantic distinction:
* Group chat ID in allowlist -> accept any group member (fixes #4559)
* Group chat ID NOT in allowlist -> enforce sender allowlist (preserves security)
- This addresses concerns about config semantics raised in code review
The fix maintains backward compatibility:
- 'groupAllowFrom' with group chat IDs now correctly acts as group enablement
- 'groupAllowFrom' with sender IDs continues to work as sender allowlist
- Operators should use group chat IDs for group enablement, sender IDs for sender control
Note: If operators were using 'groupAllowFrom' with group IDs expecting sender-level
filtering, they should migrate to a separate sender allowlist config. This is the
intended behavior per issue #4559.
* Telegram: allow per-group groupPolicy overrides
* Telegram: support per-group groupPolicy overrides (#9775) (thanks @nicolasstanley)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
* chore: remove tracked .DS_Store files
* Fix: Enable scrolling on the dashboard config page (#1822)
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* feat: add xAI Grok provider support
* fix(onboard): align xAI default model to grok-4
* chore: changelog for xAI onboarding (#9885) (thanks @grp06)
* fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer (#9823)
* fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer
ensureLoaded(forceReload) called recomputeNextRuns before runDueJobs,
which recalculated nextRunAtMs to a strictly future time. Since
setTimeout always fires a few ms late, the due check (now >= nextRunAtMs)
always failed and every/cron jobs never executed. Fixes #9788.
* docs: add changelog entry for cron timer race fix (#9823) (thanks @pycckuu)
---------
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
* fix(cron): re-arm timer in finally to survive transient errors (#9948)
* fix(cron): handle legacy atMs field in schedule when computing next run (#9932)
* fix(cron): handle legacy atMs field in schedule when computing next run
The cron scheduler only checked for `schedule.at` (string) but legacy jobs
may have `schedule.atMs` (number) from before the schema migration.
This caused nextRunAtMs to stay null because:
1. Store migration runs on load but may not persist immediately
2. Race conditions or file mtime issues can skip migration
3. computeJobNextRunAtMs/computeNextRunAtMs only checked `at`, not `atMs`
Fix: Make both functions defensive by checking `atMs` first (number),
then `atMs` (string, for edge cases), then falling back to `at` (string).
This ensures jobs fire correctly even if:
- Migration hasn't run yet
- Old data was written by a previous version
- The store was manually edited
Fixes #9930
* fix: validate numeric atMs to prevent NaN/Infinity propagation
Addresses review feedback - numeric atMs values are now validated with
Number.isFinite() && atMs > 0 before use. This prevents corrupted or
manually edited stores from causing hot timer loops via setTimeout(..., NaN).
* fix(exec-approvals): coerce bare string allowlist entries to objects (#9790)
* fix(exec-approvals): coerce bare string allowlist entries (#9903) (thanks @mcaxtr)
* security: add skill/plugin code safety scanner (#9806)
* security: add skill/plugin code safety scanner module
* security: integrate skill scanner into security audit
* security: add pre-install code safety scan for plugins
* style: fix curly brace lint errors in skill-scanner.ts
* docs: add changelog entry for skill code safety scanner
* style: append ellipsis to truncated evidence strings
* fix(security): harden plugin code safety scanning
* fix: scan skills on install and report code-safety details
* fix: dedupe audit-extra import
* fix(security): make code safety scan failures observable
* fix(test): stabilize smoke + gateway timeouts (#9806) (thanks @abdelsfane)
---------
Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu>
Co-authored-by: Darshil <81693876+dvrshil@users.noreply.github.com>
Co-authored-by: George Pickett <gpickett00@gmail.com>
* Thinking: accept extra-high alias and sync Codex FAQ wording
* Changelog: note #9976 thinking alias + Codex 5.3 docs sync
* fix: normalize xhigh aliases and docs sync (#9976)
* fix(agents): skip tool extraction for aborted/errored assistant messages (#4598)
Fixes tool call/tool_result pairing issues that cause permanent session corruption when assistant messages have stopReason "error" or "aborted". Includes 4 unit tests.
* fix(cron): handle undefined sessionTarget in list output (#9649) (#9752)
* fix(cron): handle undefined sessionTarget in list output (#9649)
When sessionTarget is undefined, pad() would crash with 'Cannot read
properties of undefined (reading trim)'. Use '-' as fallback value.
* test(cron): add regression test for undefined sessionTarget (#9649)
Verifies that printCronList handles jobs with undefined sessionTarget
without crashing. Test fails on main branch, passes with the fix.
* fix: use correct CronSchedule format in tests (#9752) (thanks @lailoo)
Tests were using { kind: 'at', atMs: number } but the CronSchedule type
requires { kind: 'at', at: string } where 'at' is an ISO date string.
---------
Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
* chore: Update deps.
* Model: add strict gpt-5.3-codex fallback for OpenAI Codex (fixes #9989) (#9995)
* Model: allow forward-compatible OpenAI Codex GPT-5 IDs
* Model: scope Codex fallback to gpt-5.3-codex
* fix: reorder codex fallback before providerCfg, add ordering test, changelog (#9989) (thanks @w1kke)
---------
Co-authored-by: Robin <4robinlehmann@gmail.com>
* fix(nextcloud-talk): sign message text instead of JSON body (#2092)
Nextcloud Talk's ChecksumVerificationService verifies HMAC against the
extracted message/reaction text, not the full JSON body. This fixes 401
authentication errors when sending messages via the bot API.
- sendMessageNextcloudTalk: sign 'message' text only
- sendReactionNextcloudTalk: sign 'reaction' string only
* fix(slack): add mention stripPatterns for /new and /reset commands (#9971)
* fix(slack): add mention stripPatterns for /new and /reset commands
Fixes #9937
The Slack dock was missing mentions.stripPatterns that Discord has.
This caused /new and /reset to fail when sent with a mention
(e.g. @bot /reset) because <@USERID> wasn't stripped before matching.
* fix(slack): strip mentions for /new and /reset (#9971) (thanks @ironbyte-rgb)
---------
Co-authored-by: ironbyte-rgb <amontaboi76@gmail.com>
Co-authored-by: George Pickett <gpickett00@gmail.com>
* feat(feishu): replace built-in SDK with community plugin
Replace the built-in Feishu SDK with the community-maintained
clawdbot-feishu plugin by @m1heng.
Changes:
- Remove src/feishu/ directory (19 files)
- Remove src/channels/plugins/outbound/feishu.ts
- Remove src/channels/plugins/normalize/feishu.ts
- Remove src/config/types.feishu.ts
- Remove feishu exports from plugin-sdk/index.ts
- Remove FeishuConfig from types.channels.ts
New features in community plugin:
- Document tools (read/create/edit Feishu docs)
- Wiki tools (navigate/manage knowledge base)
- Drive tools (folder/file management)
- Bitable tools (read/write table records)
- Permission tools (collaborator management)
- Emoji reactions support
- Typing indicators
- Rich media support (bidirectional image/file transfer)
- @mention handling
- Skills for feishu-doc, feishu-wiki, feishu-drive, feishu-perm
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(feishu): add targeted eslint-disable comments for SDK integration
Add line-specific eslint-disable-next-line comments for SDK type casts
and union type issues, rather than file-level disables.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* fix(feishu): fix webhook mode silent exit and receive_id_type default
- monitor.ts: throw error for webhook mode instead of silently returning,
so gateway properly marks channel as failed
- targets.ts: default receive_id_type to "user_id" instead of "open_id"
for non-prefixed IDs, fixing message delivery for enterprise user IDs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* chore: update pnpm-lock.yaml for feishu extension deps
Add lockfile entries for:
- @larksuiteoapi/node-sdk@^1.56.1
- @sinclair/typebox@0.34.47
- zod@^4.3.6
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* feat(feishu): sync with clawdbot-feishu #137 (multi-account support)
- Sync latest changes from clawdbot-feishu including multi-account support
- Add eslint-disable comments for SDK-related any types
- Remove unused imports
- Fix no-floating-promises in monitor.ts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* security: redact credentials from config.get gateway responses (#9858)
* security: add skill/plugin code safety scanner module
* security: integrate skill scanner into security audit
* security: add pre-install code safety scan for plugins
* style: fix curly brace lint errors in skill-scanner.ts
* docs: add changelog entry for skill code safety scanner
* security: redact credentials from config.get gateway responses
The config.get gateway method returned the full config snapshot
including channel credentials (Discord tokens, Slack botToken/appToken,
Telegram botToken, Feishu appSecret, etc.), model provider API keys,
and gateway auth tokens in plaintext.
Any WebSocket client—including the unauthenticated Control UI when
dangerouslyDisableDeviceAuth is set—could read every secret.
This adds redactConfigSnapshot() which:
- Deep-walks the config object and masks any field whose key matches
token, password, secret, or apiKey patterns
- Uses the existing redactSensitiveText() to scrub the raw JSON5 source
- Preserves the hash for change detection
- Includes 15 test cases covering all channel types
* security: make gateway config writes return redacted values
* test: disable control UI by default in gateway server tests
* fix: redact credentials in gateway config APIs (#9858) (thanks @abdelsfane)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
* fix: release session locks on process termination (#1962)
Adds cleanup handlers to release held file locks when the process
terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned
lock files that would block future sessions.
Fixes #1951
* fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support (#9870)
* fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support
Adds configurable streaming parameter to model configuration and sets streaming
to false by default for Ollama models. This addresses the corrupted response
issue caused by upstream SDK bug badlogic/pi-mono#1205 where interleaved
content/reasoning deltas in streaming responses cause garbled output.
Changes:
- Add streaming param to AgentModelEntryConfig type
- Set streaming: false default for Ollama models
- Add OLLAMA_API_KEY to envMap (was missing, preventing env var auth)
- Document streaming configuration in Ollama provider docs
- Add tests for Ollama model configuration
Users can now configure streaming per-model and Ollama authentication
via OLLAMA_API_KEY environment variable works correctly.
Fixes #8839
Related: badlogic/pi-mono#1205
* docs(ollama): use gpt-oss:20b as primary example
Updates documentation to use gpt-oss:20b as the primary example model
since it supports tool calling. The model examples now show:
- gpt-oss:20b as the primary recommended model (tool-capable)
- llama3.3 and qwen2.5-coder:32b as additional options
This provides users with a clear, working example that supports
OpenClaw's tool calling features.
* chore: remove unused vi import from ollama test
* fix: untrack dist/control-ui build artifacts (#1856)
The dist/control-ui/ files were committed before the dist/ gitignore
rule was effective. These build artifacts get regenerated during
builds, causing dirty repo errors that block the auto-update mechanism.
Removes the files from git tracking while keeping them locally and
respecting the existing dist/ gitignore entry.
Fixes #1838
Co-authored-by: Claude <noreply@anthropic.com>
* chore: add weekly upstream sync workflow
Merges openclaw/openclaw main on a weekly schedule using -X ours
so our fork patches always take priority. Opens a PR for visibility.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Yeom-JinHo <81306489+Yeom-JinHo@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Lucas Kim <ichbinlucas211@gmail.com>
Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com>
Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Glucksberg <markuscontasul@gmail.com>
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Yudong Han <hanyd@pku.edu.cn>
Co-authored-by: Iranb <49674669+Iranb@users.noreply.github.com>
Co-authored-by: Seb Slight <sebslight@gmail.com>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com>
Co-authored-by: mudrii <mudreac@gmail.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: lsh411 <lsh411@gmail.com>
Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: Victor Mier <victormier@gmail.com>
Co-authored-by: f-trycua <f@trycua.com>
Co-authored-by: hyf0-agent <ada.20260202@outlook.com>
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
Co-authored-by: Kelvin Calcano <kelvinr02@hotmail.com>
Co-authored-by: M00N7682 <dfjk71@khu.ac.kr>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: damaozi <1811866786@qq.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Co-authored-by: Soumyadeep Ghosh <soumyadeepghosh617@gmail.com>
Co-authored-by: Clawdbot <lukavyi@me.com>
Co-authored-by: 大猫子 <ll1042668699@gmail.com>
Co-authored-by: Rajat Joshi <78920780+18-RAJAT@users.noreply.github.com>
Co-authored-by: Michael Lee <5957298+TinyTb@users.noreply.github.com>
Co-authored-by: Slurpy <slurpy@openclaw.ai>
Co-authored-by: 九灵云 <server@jiulingyun.cn>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: Caelum <subasiarhan3@gmail.com>
Co-authored-by: MattQ <115874885+mattqdev@users.noreply.github.com>
Co-authored-by: Omar Khaleel <bmw15925@gmail.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com>
Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com>
Co-authored-by: Markus Glucksberg <markus@glucksberg.com>
Co-authored-by: Shrinija Kummari <shrinija@justpaid.ai>
Co-authored-by: George Pickett <gpickett00@gmail.com>
Co-authored-by: nicolasstanley <60584925+nicolasstanley@users.noreply.github.com>
Co-authored-by: Daijiro Miyazawa <dxd5001@gmail.com>
Co-authored-by: Igor Markelov <pycckuu@users.noreply.github.com>
Co-authored-by: Maksym Brashchenko <39818683+j2h4u@users.noreply.github.com>
Co-authored-by: fujiwara-tofu-shop <fujiwara@foundnone.xyz>
Co-authored-by: Marcus Castro <mcaxtr@gmail.com>
Co-authored-by: Abdel Sy Fane <32418586+abdelsfane@users.noreply.github.com>
Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu>
Co-authored-by: Darshil <81693876+dvrshil@users.noreply.github.com>
Co-authored-by: slonce70 <slonce70@gmail.com>
Co-authored-by: Aisling Cahill <aisling@telnyx.com>
Co-authored-by: Robin <4robinlehmann@gmail.com>
Co-authored-by: wangai-studio <256938352+wangai-studio@users.noreply.github.com>
Co-authored-by: ironbyte-rgb <amtaboi76@gmail.com>
Co-authored-by: ironbyte-rgb <amontaboi76@gmail.com>
Co-authored-by: Yifeng Wang <xuebi@liblib.ai>
Co-authored-by: Sash Zats <sash@zats.io>
Co-authored-by: Raphael Borg Ellul Vincenti <raphael@neo-tix.com>
Co-authored-by: zerone0x <hi@trine.dev>
maxtongwang
added a commit
to maxtongwang/openclaw
that referenced
this pull request
Feb 19, 2026
…or command support (#2) * fix(control-ui): resolve header logo when gateway.controlUi.basePath is set (#7178) * fix(control-ui): resolve header logo when gateway.controlUi.basePath is set * refactor(control-ui): header logo under basePath; normalize logo URL with normalizeBasePath * docs: add changelog for #7178 (thanks @Yeom-JinHo) * docs: document secure DM mode preset (#7872) * docs: document secure DM mode preset * fix: resolve merge conflict in resizable-divider * fix(security): separate untrusted channel metadata from system prompt (thanks @KonstantinMirin) * docs: update Feishu plugin docs * feat: Add Docs Chat Widget with RAG-powered Q&A (#7908) * feat: add docs chat prototype and related scripts - Introduced a minimal documentation chatbot that builds a search index from markdown files and serves responses via an API. - Added scripts for building the index and serving the chat API. - Updated package.json with new commands for chat index building and serving. - Created a new Vercel configuration file for deployment. - Added a README for the docs chat prototype detailing usage and integration. * feat: enhance docs chat with vector-based RAG pipeline - Added vector index building and serving capabilities to the docs chat. - Introduced new scripts for generating embeddings and serving the chat API using vector search. - Updated package.json with new commands for vector index operations. - Enhanced README with instructions for the new RAG pipeline and legacy keyword pipeline. - Removed outdated Vercel configuration file. * feat: enhance chat widget with markdown rendering and style updates - Integrated dynamic loading of markdown rendering for chat responses. - Implemented a fallback for markdown rendering to ensure consistent display. - Updated CSS variables for improved theming and visual consistency. - Enhanced chat bubble and input styles for better user experience. - Added new styles for markdown content in chat bubbles, including code blocks and lists. * feat: add copy buttons to chat widget for enhanced user interaction - Implemented copy buttons for chat responses and code blocks in the chat widget. - Updated CSS styles for improved visibility and interaction of copy buttons. - Adjusted textarea height for better user experience. - Enhanced functionality to allow users to easily copy text from chat bubbles and code snippets. * feat: update chat widget styles for improved user experience - Changed accent color for better visibility. - Enhanced preformatted text styles for code blocks, including padding and word wrapping. - Adjusted positioning and styles of copy buttons for chat responses and code snippets. - Improved hover effects for copy buttons to enhance interactivity. * feat: enhance chat widget styles for better responsiveness and scrollbar design - Updated chat panel dimensions for improved adaptability on various screen sizes. - Added custom scrollbar styles for better aesthetics and usability. - Adjusted chat bubble styles for enhanced visibility and interaction. - Improved layout for expanded chat widget on smaller screens. * feat: refine chat widget code block styles and copy button functionality - Adjusted padding and margin for preformatted text in chat responses for better visual consistency. - Introduced a compact style for single-line code blocks to enhance layout. - Updated copy button logic to skip short code blocks, improving user experience when copying code snippets. * feat: add resize handle functionality to chat widget for adjustable panel width - Implemented a draggable resize handle for the chat widget's sidebar, allowing users to adjust the panel width. - Added CSS styles for the resize handle, including hover effects and responsive behavior. - Integrated drag-to-resize logic to maintain user-set width across interactions. - Ensured the panel resets to default width when closed, enhancing user experience. * feat: implement rate limiting and error handling in chat API - Added rate limiting functionality to the chat API, allowing a maximum number of requests per IP within a specified time window. - Implemented error handling for rate limit exceeded responses, including appropriate headers and retry instructions. - Enhanced error handling for other API errors, providing user-friendly messages for various failure scenarios. - Updated README to include new environment variables for rate limiting configuration. * feat: integrate Upstash Vector for enhanced document retrieval in chat API - Implemented Upstash Vector as a cloud-based storage solution for document chunks, replacing the local LanceDB option. - Added auto-detection of storage mode based on environment variables for seamless integration. - Updated the chat API to utilize the new retrieval mechanism, enhancing response accuracy and performance. - Enhanced README with setup instructions for Upstash and updated environment variable requirements. - Introduced new scripts and configurations for managing the vector index and API interactions. * feat: add create-markdown-preview.js for markdown rendering - Introduced a new script for framework-agnostic HTML rendering of markdown content. - The script includes various parsing functions to handle different markdown elements. - Updated the chat widget to load the vendored version of @create-markdown/preview for improved markdown rendering. * docs: update README for Upstash Vector index setup and environment variables - Enhanced instructions for creating a Vector index in Upstash, including detailed settings and important notes. - Clarified environment variable requirements for both Upstash and LanceDB modes. - Improved formatting and organization of setup steps for better readability. - Added health check and API endpoint details for clearer usage guidance. * feat: add TRUST_PROXY environment variable for IP address handling - Introduced the TRUST_PROXY variable to control the trust of X-Forwarded-For headers when behind a reverse proxy. - Updated the README to document the new environment variable and its default value. - Enhanced the getClientIP function to conditionally trust proxy headers based on the TRUST_PROXY setting. * feat: add ALLOWED_ORIGINS environment variable for CORS configuration - Introduced the ALLOWED_ORIGINS variable to specify allowed origins for CORS, enhancing security and flexibility. - Updated the README to document the new environment variable and its usage. - Refactored CORS handling in the server code to utilize the ALLOWED_ORIGINS setting for dynamic origin control. * fix: ensure complete markdown rendering in chat widget - Added logic to flush any remaining buffered bytes from the decoder, ensuring that all text is rendered correctly in the assistant bubble. - Updated the assistant bubble's innerHTML to reflect the complete markdown content after streaming completes. * feat: enhance DocsStore with improved vector handling and similarity conversion - Added a constant for the distance metric used in vector searches, clarifying the assumption of L2 distance. - Updated the createTable method to ensure all chunk properties are correctly mapped during table creation. - Improved the similarity score calculation by providing a clear explanation of the conversion from L2 distance, ensuring accurate ranking of results. * chore: fix code formatting * Revert "chore: fix code formatting" This reverts commit 6721f5b0b7bf60b76c519ccadfa41742f19ecf87. * chore: format code for improved readability - Reformatted code in serve.ts to enhance readability by adjusting indentation and line breaks. - Ensured consistent style for function return types and object properties throughout the file. * feat: Update API URL selection logic in chat widget - Enhanced the API URL configuration to prioritize explicit settings, defaulting to localhost for development and using a production URL otherwise. - Improved clarity in the code by adding comments to explain the logic behind the API URL selection. * chore: Update documentation structure for improved organization - Changed the path for the "Start Here" page to "start/index" for better clarity. - Reformatted the "Web & Interfaces" and "Help" groups to use multi-line arrays for improved readability. * feat: Enhance markdown preview integration and improve chat widget asset loading - Wrapped the markdown preview functionality in an IIFE to expose a global API for easier integration. - Updated the chat widget to load the markdown preview library dynamically, checking for existing instances to avoid duplicate loads. - Adjusted asset paths in the chat widget to ensure correct loading based on the environment (local or production). - Added CORS headers in the Vercel configuration for improved API accessibility. * fix: Update chat API URL to include '/api' for correct endpoint access - Modified the chat configuration and widget files to append '/api' to the API URL, ensuring proper endpoint usage in production and local environments. * refactor: Simplify docs-chat configuration and remove unused scripts - Removed outdated scripts and configurations related to the docs-chat feature, including build and serve scripts, as well as the associated package.json and README files. - Streamlined the API URL configuration in the chat widget for better clarity and maintainability. - Updated the package.json to remove unnecessary scripts related to the now-deleted functionality. * refactor: Update documentation structure for improved clarity - Changed the path for the "Start Here" page from "start/index" to "index" to enhance navigation and organization within the documentation. * chore: Remove unused dependencies from package.json and pnpm-lock.yaml - Deleted `@lancedb/lancedb`, `@upstash/vector`, and `openai` from both package.json and pnpm-lock.yaml to streamline the project and reduce bloat. * chore: Clean up .gitignore by removing obsolete entries - Deleted unused entries related to the docs-chat vector database from .gitignore to maintain a cleaner configuration. * chore: Remove deprecated chat configuration and markdown preview script - Deleted the `create-markdown-preview.js` script and the `docs-chat-config.js` file to eliminate unused assets and streamline the project. - Updated the `docs-chat-widget.js` to directly reference the markdown library from a CDN, enhancing maintainability. * chore: Update markdown rendering in chat widget to use marked library - Replaced the deprecated `create-markdown-preview` library with the `marked` library for markdown rendering. - Adjusted the script loading mechanism to fetch `marked` from a CDN, improving performance and maintainability. - Enhanced the markdown rendering function to ensure security by disabling HTML pass-through and opening links in new tabs. * Delete docs/start/index.md * fix: harden voice-call webhook verification * fix(cron): fix timeout, add timestamp validation, enable file sync Fixes #7667 Task 1: Fix cron operation timeouts - Increase default gateway tool timeout from 10s to 30s - Increase cron-specific tool timeout to 60s - Increase CLI default timeout from 10s to 30s - Prevents timeouts when gateway is busy with long-running jobs Task 2: Add timestamp validation - New validateScheduleTimestamp() function in validate-timestamp.ts - Rejects atMs timestamps more than 1 minute in the past - Rejects atMs timestamps more than 10 years in the future - Applied to both cron.add and cron.update operations - Provides helpful error messages with current time and offset Task 3: Enable file sync for manual edits - Track file modification time (storeFileMtimeMs) in CronServiceState - Check file mtime in ensureLoaded() and reload if changed - Recompute next runs after reload to maintain accuracy - Update mtime after persist() to prevent reload loop - Dashboard now picks up manual edits to ~/.openclaw/cron/jobs.json * feat(cron): introduce delivery modes for isolated jobs - Added support for new delivery modes in cron jobs: `announce`, `deliver`, and `none`. - Updated documentation to reflect changes in delivery options and usage examples. - Enhanced the cron job schema to include delivery configuration. - Refactored related CLI commands and UI components to accommodate the new delivery settings. - Improved handling of legacy delivery fields for backward compatibility. This update allows users to choose how output from isolated jobs is delivered, enhancing flexibility in job management. * feat(cron): default isolated jobs to announce delivery and enhance scheduling options - Updated isolated cron jobs to default to `announce` delivery mode, improving user experience. - Enhanced scheduling options to accept ISO 8601 timestamps for `schedule.at`, while still supporting epoch milliseconds. - Refined documentation to clarify delivery modes and scheduling formats. - Adjusted related CLI commands and UI components to reflect these changes, ensuring consistency across the platform. - Improved handling of legacy delivery fields for backward compatibility. This update streamlines the configuration of isolated jobs, making it easier for users to manage job outputs and schedules. * feat(cron): enhance one-shot job behavior and CLI options - Default one-shot jobs to delete after success, improving job management. - Introduced `--keep-after-run` CLI option to allow users to retain one-shot jobs post-execution. - Updated documentation to clarify default behaviors and new options for one-shot jobs. - Adjusted cron job creation logic to ensure consistent handling of delete options. - Enhanced tests to validate new behaviors and ensure reliability. This update streamlines the handling of one-shot jobs, providing users with more control over job persistence and execution outcomes. * feat(cron): enhance delivery modes and job configuration - Updated isolated cron jobs to support new delivery modes: `announce` and `none`, improving output management. - Refactored job configuration to remove legacy fields and streamline delivery settings. - Enhanced the `CronJobEditor` UI to reflect changes in delivery options, including a new segmented control for delivery mode selection. - Updated documentation to clarify the new delivery configurations and their implications for job execution. - Improved tests to validate the new delivery behavior and ensure backward compatibility with legacy settings. This update provides users with greater flexibility in managing how isolated jobs deliver their outputs, enhancing overall usability and clarity in job configurations. * feat(cron): set default enabled state for cron jobs - Added logic to default the `enabled` property to `true` if not explicitly set as a boolean in the cron job input. - Updated job creation and store functions to ensure consistent handling of the `enabled` state across the application. - Enhanced input normalization to improve job configuration reliability. This update ensures that cron jobs are enabled by default, enhancing user experience and reducing potential misconfigurations. * refactor(cron): update delivery instructions for isolated agent - Revised the delivery instructions in the isolated agent's command body to clarify that summaries should be returned as plain text and will be delivered by the main agent. - Removed the previous directive regarding messaging tools to streamline communication guidelines. This change enhances clarity in the delivery process for isolated agent tasks. * feat(cron): enhance delivery handling and testing for isolated jobs - Introduced new properties for explicit message targeting and message tool disabling in the EmbeddedRunAttemptParams type. - Updated cron job tests to validate best-effort delivery behavior and handling of delivery failures. - Added logic to clear delivery settings when switching session targets in cron jobs. - Improved the resolution of delivery failures and best-effort logic in the isolated agent's run function. This update enhances the flexibility and reliability of delivery mechanisms in isolated cron jobs, ensuring better handling of message delivery scenarios. * refactor(cron): improve delivery configuration handling in CronJobEditor and CLI - Enhanced the delivery configuration logic in CronJobEditor to explicitly set the bestEffort property based on job settings. - Refactored the CLI command to streamline delivery object creation, ensuring proper handling of optional fields like channel and to. - Improved code readability and maintainability by restructuring delivery assignment logic. This update clarifies the delivery configuration process, enhancing the reliability of job settings in both the editor and CLI. * feat(cron): enhance legacy delivery handling in job patches - Introduced logic to map legacy payload delivery updates onto the delivery object for `agentTurn` jobs, ensuring backward compatibility with legacy clients. - Added tests to validate the correct application of legacy delivery settings in job patches, improving reliability in job configuration. - Refactored delivery handling functions to streamline the merging of legacy delivery fields into the current job structure. This update enhances the flexibility of delivery configurations, ensuring that legacy settings are properly handled in the context of new job patches. * fix(cron): fix test failures and regenerate protocol files - Add forceReload option to ensureLoaded to avoid stat I/O in normal paths while still detecting cross-service writes in the timer path - Post isolated job summary back to main session (restores the old isolation.postToMainPrefix behavior via delivery model) - Update legacy migration tests to check delivery.channel instead of payload.channel (normalization now moves delivery fields to top-level) - Remove legacy deliver/channel/to/bestEffortDeliver from payload schema - Update protocol conformance test for delivery modes - Regenerate GatewayModels.swift (isolation -> delivery) * UI: handle future timestamps in formatAgo * Changelog: move cron entries to 2026.2.3 * fix: cron announce delivery path (#8540) (thanks @tyler6204) * Telegram: use Grammy types directly, add typed Probe/Audit to plugin interface (#8403) * Telegram: replace duplicated types with Grammy imports, add Probe/Audit generics to plugin interface * Telegram: remove legacy forward metadata (deprecated in Bot API 7.0), simplify required-field checks * Telegram: clean up remaining legacy references and unnecessary casts * Telegram: keep RequestInit parameter type in proxy fetch (addresses review feedback) * Telegram: add exhaustiveness guard to resolveForwardOrigin switch * fix(telegram): include forward_from_chat metadata in forwarded message context (#8133) Extract missing metadata from forwarded Telegram messages: - Add fromChatType to TelegramForwardedContext, capturing the original chat type (channel/supergroup/group) from forward_from_chat.type and forward_origin.chat/sender_chat.type - Add fromMessageId to capture the original message ID from channel forwards - Read author_signature from forward_origin objects (modern API), preferring it over the deprecated forward_signature field - Pass ForwardedFromChatType and ForwardedFromMessageId through to the inbound context payload - Add test coverage for forward_origin channel/chat types, including author_signature extraction and fromChatType propagation * fix: trim legacy signature fallback, type fromChatType as union * fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg) * fix(imessage): unify timeout configuration with configurable probeTimeoutMs - Add probeTimeoutMs config option to channels.imessage - Export DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS constant (10s) from probe.ts - Propagate timeout config through all iMessage probe/RPC operations - Fix hardcoded 2000ms timeouts that were too short for SSH connections Closes: timeout issues when using SSH wrapper scripts (imsg-ssh) * fix: address review comments - Use optional timeoutMs parameter (undefined = use config/default) - Extract DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS to shared constants.ts - Import constant in client.ts instead of hardcoding - Re-export constant from probe.ts for backwards compatibility * fix(imessage): detect self-chat echoes to prevent infinite loops (#8680) * fix: align proxy fetch typing * feat: add cloudflare ai gateway provider * fix: force reload cron store * Revert "feat: Add Docs Chat Widget with RAG-powered Q&A (#7908)" (#8834) This reverts commit fa4b28d7af7464b07271bfef6c028e4135548f44. * fix(web ui): agent model selection * Docs: landing page revamp (#8885) * Docs: refresh landing page * Docs: add landing page companion pages * Docs: drop legacy Jekyll assets * Docs: remove legacy terminal css test * Docs: restore terminal css assets * Docs: remove terminal css assets * fix(app-render): handle optional model in renderApp function * chore: replace landpr prompt with end-to-end landing workflow (#8916) * 🤖 docs: mirror landing revamp for zh-CN What: - add zh-CN versions of landing revamp pages (features, quickstart, docs directory, network model, credits) - refresh zh-CN index and hubs, plus glossary entries Why: - keep Chinese docs aligned with the new English landing experience - ensure navigation surfaces the new entry points Tests: - pnpm build && pnpm check && pnpm test * 🤖 docs: note zh-CN landing revamp (#8994) (thanks @joshp123) What: - add changelog entry for the zh-CN landing revamp docs Why: - record the doc update and thank the contributor Tests: - pnpm lint && pnpm build && pnpm test * feat: add shell completion installation prompt to CLI update command * feat: add shell completion test script for installation verification * completion: export cache utilities and require cached file for installation - Export `resolveCompletionCachePath` and `completionCacheExists` for external use - Update `installCompletion` to require cache existence (never use slow dynamic pattern) - Add `usesSlowDynamicCompletion` to detect old `source <(...)` patterns - Add `getShellProfilePath` helper for consistent profile path resolution - Update `formatCompletionSourceLine` to always use cached file * doctor: add shell completion check module - Add `checkShellCompletionStatus` to get profile/cache/slow-pattern status - Add `ensureCompletionCacheExists` for silent cache regeneration - Add `doctorShellCompletion` to check and fix completion issues: - Auto-upgrade old slow dynamic patterns to cached version - Auto-regenerate cache if profile exists but cache is missing - Prompt to install if no completion is configured * doctor: integrate shell completion check into doctor command - Import and call `doctorShellCompletion` during doctor run - Checks/fixes completion issues before gateway health check * update: use shared completion helpers for shell completion setup - Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists` - Auto-upgrade old slow dynamic patterns silently during update - Auto-regenerate cache if profile exists but cache is missing - Prompt to install if no completion is configured * onboard: use shared completion helpers for shell completion setup - Replace inline completion logic with `checkShellCompletionStatus` and `ensureCompletionCacheExists` - Auto-upgrade old slow dynamic patterns silently during onboarding - Auto-regenerate cache if profile exists but cache is missing - Prompt to install if no completion is configured * scripts: update test-shell-completion to use shared helpers - Use `checkShellCompletionStatus` and `ensureCompletionCacheExists` from doctor-completion - Display "Uses slow pattern" status in output - Simulate doctor/update/onboard behavior for all completion scenarios - Remove duplicated utility functions * changelog: add shell completion auto-fix entry * feat: per-channel responsePrefix override (#9001) * feat: per-channel responsePrefix override Add responsePrefix field to all channel config types and Zod schemas, enabling per-channel and per-account outbound response prefix overrides. Resolution cascade (most specific wins): L1: channels.<ch>.accounts.<id>.responsePrefix L2: channels.<ch>.responsePrefix L3: (reserved for channels.defaults) L4: messages.responsePrefix (existing global) Semantics: - undefined -> inherit from parent level - empty string -> explicitly no prefix (stops cascade) - "auto" -> derive [identity.name] from routed agent Changes: - Core logic: resolveResponsePrefix() in identity.ts accepts optional channel/accountId and walks the cascade - resolveEffectiveMessagesConfig() passes channel context through - Types: responsePrefix added to WhatsApp, Telegram, Discord, Slack, Signal, iMessage, Google Chat, MS Teams, Feishu, BlueBubbles configs - Zod schemas: responsePrefix added for config validation - All channel handlers wired: telegram, discord, slack, signal, imessage, line, heartbeat runner, route-reply, native commands - 23 new tests covering backward compat, channel/account levels, full cascade, auto keyword, empty string stops, unknown fallthrough Fully backward compatible - no existing config is affected. Fixes #8857 * fix: address CI lint + review feedback - Replace Record<string, any> with proper typed helpers (no-explicit-any) - Add curly braces to single-line if returns (eslint curly) - Fix JSDoc: 'Per-channel' → 'channel/account' on shared config types - Extract getChannelConfig() helper for type-safe dynamic key access * fix: finish responsePrefix overrides (#9001) (thanks @mudrii) * fix: normalize prefix wiring and types (#9001) (thanks @mudrii) --------- Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * Discord: allow disabling thread starter context * feat(heartbeat): add accountId config option for multi-agent routing (#8702) * feat(heartbeat): add accountId config option for multi-agent routing Add optional accountId field to heartbeat configuration, allowing multi-agent setups to explicitly specify which Telegram account should be used for heartbeat delivery. Previously, heartbeat delivery would use the accountId from the session's deliveryContext. When a session had no prior conversation history, heartbeats would default to the first/primary account instead of the agent's intended bot. Changes: - Add accountId to HeartbeatSchema (zod-schema.agent-runtime.ts) - Use heartbeat.accountId with fallback to session accountId (targets.ts) Backward compatible: if accountId is not specified, behavior is unchanged. Closes #8695 * fix: improve heartbeat accountId routing (#8702) (thanks @lsh411) * fix: harden heartbeat accountId routing (#8702) (thanks @lsh411) * fix: expose heartbeat accountId in status (#8702) (thanks @lsh411) * chore: format status + heartbeat tests (#8702) (thanks @lsh411) --------- Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> * TUI/Gateway: fix pi streaming + tool routing + model display + msg updating (#8432) * TUI/Gateway: fix pi streaming + tool routing * Tests: clarify verbose tool output expectation * fix: avoid seq gaps for targeted tool events (#8432) (thanks @gumadeiras) * Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077) * Telegram: remove @ts-nocheck from bot.ts and bot-message-dispatch.ts - bot/types.ts: TelegramContext.me uses UserFromGetMe (Grammy) instead of manual inline type - bot.ts: remove 6 unsafe casts (as any, as unknown, as object), use Grammy types directly - bot.ts: remove dead message_thread_id access on reactions (not in Telegram Bot API) - bot.ts: remove resolveThreadSessionKeys import (no longer needed for reactions) - bot-message-dispatch.ts: replace ': any' with DispatchTelegramMessageParams type - bot-message-dispatch.ts: add sticker.fileId guard before cache access - bot.test.ts: update reaction tests, remove dead DM thread-reaction test * Telegram: remove duplicate bot.catch handler (only the last one runs in Grammy) * Telegram: remove @ts-nocheck from bot.ts, fix duplicate error handler, harden sticker caching (#9077) * Security: Prevent gateway credential exfiltration via URL override (#9179) * Gateway: require explicit auth for url overrides * Gateway: scope credential blocking to non-local URLs only Address review feedback: the previous fix blocked credential fallback for ALL URL overrides, which was overly strict and could break workflows that use --url to switch between loopback/tailnet without passing credentials. Now credential fallback is only blocked for non-local URLs (public IPs, external hostnames). Local addresses (127.0.0.1, localhost, private IPs like 192.168.x.x, 10.x.x.x, tailnet 100.x.x.x) still get credential fallback as before. This maintains the security fix (preventing credential exfiltration to attacker-controlled URLs) while preserving backward compatibility for legitimate local URL overrides. * Security: require explicit credentials for gateway url overrides (#8113) (thanks @victormier) * Gateway: reuse explicit auth helper for url overrides (#8113) (thanks @victormier) * Tests: format gateway chat test (#8113) (thanks @victormier) * Tests: require explicit auth for gateway url overrides (#8113) (thanks @victormier) --------- Co-authored-by: Victor Mier <victormier@gmail.com> * Tests: restore TUI gateway env * Security: harden sandboxed media handling (#9182) * Message: enforce sandbox for media param * fix: harden sandboxed media handling (#8780) (thanks @victormier) * chore: format message action runner (#8780) (thanks @victormier) --------- Co-authored-by: Victor Mier <victormier@gmail.com> * Telegram: remove @ts-nocheck from bot-message.ts (#9180) * Telegram: remove @ts-nocheck from bot-message.ts, type deps via Omit<BuildTelegramMessageContextParams> * Telegram: widen allMedia to TelegramMediaRef[] so stickerMetadata flows through * Telegram: remove @ts-nocheck from bot-message.ts (#9180) * fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188) * Security: owner-only tools + command auth hardening (#9202) * Security: gate whatsapp_login by sender auth * Security: treat undefined senderAuthorized as unauthorized (opt-in) * fix: gate whatsapp_login to owner senders (#8768) (thanks @victormier) * fix: add explicit owner allowlist for tools (#8768) (thanks @victormier) * fix: normalize escaped newlines in send actions (#8768) (thanks @victormier) --------- Co-authored-by: Victor Mier <victormier@gmail.com> * Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206) * Telegram: remove @ts-nocheck from bot-handlers.ts, use Grammy types directly, deduplicate StickerMetadata * Telegram: remove last @ts-nocheck from bot-handlers.ts (#9206) * Message: clarify media schema + fix MEDIA newline * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes #8481 * fix: infer auth choice from API key flags (#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * chore: sync plugin versions to 2026.2.3 * fix(mac): resolve cron schedule formatters * chore(mac): update appcast for 2026.2.3 * chore: update 2026.2.3 notes * fix: gracefully downgrade xhigh thinking level in cron isolated agent (#9363) When thinkingDefault is set to "xhigh" but the configured model does not support it (e.g. Claude), the cron isolated-agent path throws a hard error causing the job to fail. The interactive chat path already handles this by silently downgrading to "high". Apply the same graceful downgrade in the cron path: log a warning and fall back to "high" instead of crashing. Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com> * fix: restore discord owner hint from allowlists * fix: remove unused cron import * fix(cli): resolve bundled chrome extension path * test(cli): use unique temp dir for extension install * fix(cli): support bundled extension path in dist root * style(cli): satisfy lint rules in extension path resolver * fix: resolve bundled chrome extension assets (#8914) (thanks @kelvinCB) * Tests: add test coverage for security/windows-acl.ts Adds comprehensive unit tests for Windows ACL inspection utilities: - resolveWindowsUserPrincipal: username resolution with fallback - parseIcaclsOutput: icacls output parsing - summarizeWindowsAcl: ACL entry classification (trusted/world/group) - inspectWindowsAcl: async ACL inspection with mocked exec - formatWindowsAclSummary: summary string formatting - formatIcaclsResetCommand: reset command string generation - createIcaclsResetCommand: structured reset command generation All 26 tests passing. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix: stabilize windows acl tests and command auth registry (#9335) (thanks @M00N7682) * test: register discord plugin in allowlist test * chore: bump version to 2026.2.4 * fix: resolve discord owner allowFrom matches * fix(telegram): preserve DM topic threadId in deliveryContext When receiving messages in Telegram DM topics (Topics in Private Chats), the threadId was not saved in the session's deliveryContext, causing replies to go to General chat instead of the topic. Now we pass threadId to updateLastRoute for DM topics. Fixes #8891 * test(telegram): add DM topic threadId deliveryContext test for #8891 Verifies that threadId is passed to updateLastRoute for DM topics. Test fails on main branch, passes with the fix. * fix: preserve telegram DM topic threadId (#9039) (thanks @lailoo) * Update deps. * chore: Typecheck test helper files. * Docs: streamline start and install docs (#9648) * docs(start): streamline getting started flow * docs(nav): reorganize start and install sections * docs(style): move custom css to style.css * docs(navigation): align zh-CN ordering * docs(navigation): localize zh-Hans labels * docs(install): rename install overview page * CLI: sort commands alphabetically in help output Fixes #7964 Added sortSubcommands: true to configureHelp() to display commands in alphabetical order when running 'openclaw --help'. * fix: update changelog for help sorting (#8068) (thanks @deepsoumya617) * docs(onboarding): add bootstrapping page (#9767) * docs: fix onboarding rendering issues * chore: reset appcast to 2026.2.3 * fix(telegram): pass parentPeer for forum topic binding inheritance (#9789) Fixes #9545 and #9351. When a message comes from a Telegram forum topic, the peer ID includes the topic suffix (e.g., `-1001234567890:topic:99`). Users configure bindings with the base group ID, which previously did not match. This adds `parentPeer` to `resolveAgentRoute()` calls for forum groups, enabling binding inheritance from the parent group to all topics. - Extract `buildTelegramParentPeer()` helper in bot/helpers.ts - Pass parentPeer in bot-message-context.ts, bot-handlers.ts, bot-native-commands.ts, and bot.ts (reaction handler) - Add tests for forum topic routing and topic precedence * docs(onboarding): streamline CLI onboarding docs (#9830) * fix: auto-inject Telegram forum topic threadId in message tool When using Telegram DM topics (forum topics), messages sent via the message tool (media, buttons, etc.) land in General Topic instead of the user's current topic. This happens because Slack has resolveSlackAutoThreadId for auto-threading but Telegram had no equivalent. Add resolveTelegramAutoThreadId that mirrors the Slack pattern: - When channel is telegram and no explicit threadId is provided - Check if toolContext.currentThreadTs (the topic ID) is set - Verify the target matches the originating chat - Inject the threadId into params so the Telegram plugin action handler picks it up for sendMessage/sendMedia The subagent announce path already correctly passes threadId via requesterOrigin (set from agentThreadId in sessions-spawn-tool), so no changes needed there. * test: cover telegram topic threadId auto-injection and subagent origin threading * fix: pass threadId/to/accountId from parent to subagent gateway call When spawning a subagent, the requesterOrigin's threadId, to, and accountId were not forwarded to the callGateway({method:'agent'}) params. This meant the subagent's runContext had no currentThreadTs or currentChannelId, so resolveTelegramAutoThreadId could not auto-inject the forum topic thread ID when the subagent used the message tool. Changes: - sessions-spawn-tool: pass to, accountId, threadId from requesterOrigin - run-context: populate currentChannelId from opts.to as fallback Fixes subagent messages landing in General Topic instead of the correct Telegram DM topic thread. * fix: telegram topic auto-threading — use parseTelegramTarget, add tests (#7235) (thanks @Lukavyi) * update handle * docs: fix incorrect model.fallback to model.fallbacks in Ollama config (#9384) (#9749) Both English and Chinese documentation had incorrect configuration template using 'fallback' instead of 'fallbacks' in agents.defaults.model config. Co-authored-by: damaozi <1811866786@qq.com> * fix(cli): avoid NODE_OPTIONS for --disable-warning (#9691) (thanks @18-RAJAT) Fixes npm pack failing on modern Node where --disable-warning is disallowed in NODE_OPTIONS. * feat: add Claude Opus 4.6 to built-in model catalog (#9853) * feat: add Claude Opus 4.6 to built-in model catalog - Update default model from claude-opus-4-5 to claude-opus-4-6 - Add opus-4.6 model ID normalization - Add claude-opus-4-6 to live model filter prefixes - Update image tool to prefer claude-opus-4-6 for vision - Add CLI backend alias for opus-4.6 - Update onboard auth default selections to include opus-4.6 - Update model picker placeholder Closes #9811 * test: update tests for claude-opus-4-6 default - Fix model-alias-defaults test to use claude-opus-4-6 - Fix image-tool test to expect claude-opus-4-6 in fallbacks * feat: support claude-opus-4-6 * docs: update changelog for opus 4.6 (#9853) (thanks @TinyTb) * chore: bump pi to 0.52.0 --------- Co-authored-by: Slurpy <slurpy@openclaw.ai> Co-authored-by: Peter Steinberger <steipete@gmail.com> * 🤖 Feishu: expand channel support What: - add post parsing, doc link extraction, routing, replies, reactions, typing, and user lookup - fix media download/send flows and make doc fetches domain-aware - update Feishu docs and clawtributor credits Why: - raise Feishu parity with other channels and avoid dropped group messages - keep replies threaded while supporting Lark domains - document new configuration and credit the contributor Tests: - pnpm build - pnpm check - pnpm test (gateway suite timed out; reran pnpm vitest run --config vitest.gateway.config.ts) Co-authored-by: 九灵云 <server@jiulingyun.cn> * 🤖 Feishu: tighten mention gating What: - require the bot open_id match for group mention detection when available Why: - prevent replies when other users are mentioned and the bot id is known Tests: - pnpm test * fix: remove orphaned tool_results during compaction pruning When pruneHistoryForContextShare drops chunks of messages, it could drop an assistant message with tool_use blocks while leaving corresponding tool_result messages in the kept portion. These orphaned tool_results cause Anthropic's API to reject the session with 'unexpected tool_use_id'. Fix by calling repairToolUseResultPairing after each chunk drop to clean up any orphaned tool_results. This reuses existing battle-tested code from session-transcript-repair.ts. Fixes #9769, #9724, #9672 * fix cron scheduling and reminder delivery regressions (#9733) * fix(cron): prevent timer from allowing process exit (fixes #9694) The cron timer was using .unref(), which caused the Node.js event loop to exit or sleep if no other handles were active. This prevented cron jobs from firing in some environments. * fix(cron): infer delivery target for isolated jobs (fixes #9683) When creating isolated agentTurn jobs (e.g. reminders) without explicit delivery options, the job would default to 'announce' but fail to resolve the target conversation. Now, we infer the channel and recipient from the agent's current session key. * fix(cron): enhance delivery inference for threaded sessions and null inputs (#9733) Improves the delivery inference logic in the cron tool to correctly handle threaded session keys and cases where delivery is explicitly set to null. This ensures that the appropriate delivery mode and target are inferred based on the agent's session key, enhancing the reliability of job execution. * fix: preserve telegram topic delivery inference (#9733) (thanks @tyler6204) * fix: simplify cron delivery merge spread (#9733) (thanks @tyler6204) * chore: add agent credentials to gitignore (#9874) Protect sensitive files from accidental commit: - memory/ (moltbook credentials, session data) - .agent/*.json (agent config, moltbook.json) Workflows in .agent/workflows/ remain tracked. Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> * Docs: escape hash symbol in help channel names in issue template (#9695) * feat(skills): add QR code skill (#8817) feat(skills): add QR code generation and reading skill Adds qr-code skill with: - qr_generate.py - Generate QR codes with customizable size/error correction - qr_read.py - Decode QR codes from images - SKILL.md documentation Co-authored-by: Omar-Khaleel * chore(agentsmd): add tsgo command to AGENTS.md (#9894) Add `pnpm tsgo` command to AGENTS.md development reference Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com> * fix(runtime): bump minimum Node.js version to 22.12.0 (#5370) * fix(runtime): bump minimum Node.js version to 22.12.0 Aligns the runtime guard with the declared package.json engines requirement. The Matrix plugin (and potentially others) requires Node >= 22.12.0, but the runtime guard previously allowed 22.0.0+. This caused confusing errors like 'Cannot find module @vector-im/matrix-bot-sdk' when the real issue was an unsupported Node version. - Update MIN_NODE from 22.0.0 to 22.12.0 - Update error message to reflect the correct version - Update tests to use 22.12.0 as the minimum valid version Fixes #5292 * fix: update test versions to match MIN_NODE=22.12.0 --------- Co-authored-by: Markus Glucksberg <markus@glucksberg.com> * fix: clear stale token metrics on /new and /reset (#8929) When starting a new session via /new or /reset, the token usage fields (totalTokens, inputTokens, outputTokens, contextTokens) survived from the previous session via the spread pattern in session init. This caused /status to display misleading context usage from the old session. Clear all four token metrics explicitly in the isNewSession block, alongside the existing compactionCount reset. Also add diagnostic logging for session forking via ParentSessionKey to help trace context inheritance. * chore: apply local workspace updates (#9911) * chore: apply local workspace updates * fix: resolve prep findings after rebase (#9898) (thanks @gumadeiras) * refactor: centralize model allowlist normalization (#9898) (thanks @gumadeiras) * fix: guard model allowlist initialization (#9911) * docs: update changelog scope for #9911 * docs: remove model names from changelog entry (#9911) * fix: satisfy type-aware lint in model allowlist (#9911) * fix: allow multiple compaction retries on context overflow (#8928) Previously, overflowCompactionAttempted was a boolean flag set once, preventing recovery when a single compaction wasn't enough. Change to a counter allowing up to 3 attempts before giving up. Also add diagnostic logging on overflow events to help debug early-overflow issues. Fixes sessions that hit context overflow during long agentic turns with many tool calls, where one compaction round isn't sufficient to bring context below limits. * fix(errors): show clear billing error instead of cryptic API response (#8391) * fix(errors): return clear billing error message instead of cryptic raw error (#8136) When an LLM API provider returns a credit/billing-related error (HTTP 402, insufficient credits, low balance, etc.), OpenClaw now shows a clear, actionable message instead of passing through the raw/cryptic error text: ⚠️ API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key. Changes: - formatAssistantErrorText: detect billing errors via isBillingErrorMessage() and return a user-friendly message (placed before the generic HTTP/JSON error fallthrough) - sanitizeUserFacingText: same billing detection for the sanitization path - pi-embedded-runner/run.ts: add billingFailure detection in the profile exhaustion fallback, so the FailoverError message is billing-specific - Added 3 new tests for credit balance, HTTP 402, and insufficient credits * fix: extract billing error message to shared constant * Revert "feat(skills): add QR code skill (#8817)" This reverts commit ad13c265ba1fd22dadfe30325ed998d9a3d95e5c. * docs: improve DM security guidance with concrete example Add a more prominent security warning for multi-user DM setups: - Add blockquote security warning about context leakage - Include concrete example showing the privacy risk - Add "When to enable this" checklist - Clarify that default is fine for single-user setups Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * docs: tighten secure DM example * docs: note secure DM guidance update (#9377) (thanks @Shrinija17) * Agents: bump pi-mono to 0.52.5 (#9949) * Agents: bump pi-mono to 0.52.5 * Changelog: add PR reference for pi bump * docs: restructure Get Started tab and improve onboarding flow (#9950) * docs: restructure Get Started tab and improve onboarding flow - Flatten nested Onboarding group into linear First Steps flow - Add 'What is OpenClaw?' narrative section to landing page - Split wizard.md into streamlined overview + full reference (reference/wizard.md) - Move Pairing to Channels > Configuration - Move Bootstrapping to Agents > Fundamentals - Move macOS app onboarding to Platforms > macOS companion app - Move Lore to Help > Community - Remove duplicate install instructions from openclaw.md - Mirror navigation changes in zh-CN tabs - No content deleted — all detail preserved or relocated * docs: move deployment pages to install/, fix Platforms tab routing, clarify onboarding paths - Move deployment guides (fly, hetzner, gcp, macos-vm, exe-dev, railway, render, northflank) from platforms/ and root to install/ - Add 'Hosting and deployment' group to Install tab - Slim Gateway & Ops 'Remote access and deployment' down to 'Remote access' - Swap Platforms tab before Gateway & Ops to fix path-prefix routing - Move macOS app onboarding into First steps (parallel to CLI wizard) - Rename sidebar titles to 'Onboarding: CLI' / 'Onboarding: macOS App' - Add redirects for all moved paths - Update all internal links (en + zh-CN) - Fix img tag syntax in onboarding.md * fix(telegram): accept messages from group members in allowlisted groups (#9775) * fix(telegram): accept messages from group members in allowlisted groups Issue #4559: Telegram bot was silently dropping messages from non-paired users in allowlisted group chats due to overly strict sender filtering. The fix adds a check to distinguish between: 1. Group itself is allowlisted → accept messages from any member 2. Group is NOT allowlisted → only accept from allowlisted senders Changes: - Check if group ID is in the allowlist (or allowlist is wildcard) - Only reject sender if they're not in allowlist AND group is not allowlisted - Improved logging to indicate the actual reason for rejection This preserves security controls while fixing the UX issue where group members couldn't participate unless individually allowlisted. Backwards compatible: existing allowlists continue to work as before. * style: format telegram fix for oxfmt compliance * refactor(telegram): clarify group allowlist semantics in fix for #4559 Changes: - Rename 'isGroupInAllowlist' to 'isGroupChatIdInAllowlist' for clarity - Expand comments to explain the semantic distinction: * Group chat ID in allowlist -> accept any group member (fixes #4559) * Group chat ID NOT in allowlist -> enforce sender allowlist (preserves security) - This addresses concerns about config semantics raised in code review The fix maintains backward compatibility: - 'groupAllowFrom' with group chat IDs now correctly acts as group enablement - 'groupAllowFrom' with sender IDs continues to work as sender allowlist - Operators should use group chat IDs for group enablement, sender IDs for sender control Note: If operators were using 'groupAllowFrom' with group IDs expecting sender-level filtering, they should migrate to a separate sender allowlist config. This is the intended behavior per issue #4559. * Telegram: allow per-group groupPolicy overrides * Telegram: support per-group groupPolicy overrides (#9775) (thanks @nicolasstanley) --------- Co-authored-by: George Pickett <gpickett00@gmail.com> * chore: remove tracked .DS_Store files * Fix: Enable scrolling on the dashboard config page (#1822) * Fix: Enable scrolling in dashboard * Fix: Enable scrolling in dashboard * Fix: Enable scrolling in dashboard * feat: add xAI Grok provider support * fix(onboard): align xAI default model to grok-4 * chore: changelog for xAI onboarding (#9885) (thanks @grp06) * fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer (#9823) * fix(cron): prevent recomputeNextRuns from skipping due jobs in onTimer ensureLoaded(forceReload) called recomputeNextRuns before runDueJobs, which recalculated nextRunAtMs to a strictly future time. Since setTimeout always fires a few ms late, the due check (now >= nextRunAtMs) always failed and every/cron jobs never executed. Fixes #9788. * docs: add changelog entry for cron timer race fix (#9823) (thanks @pycckuu) --------- Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> * fix(cron): re-arm timer in finally to survive transient errors (#9948) * fix(cron): handle legacy atMs field in schedule when computing next run (#9932) * fix(cron): handle legacy atMs field in schedule when computing next run The cron scheduler only checked for `schedule.at` (string) but legacy jobs may have `schedule.atMs` (number) from before the schema migration. This caused nextRunAtMs to stay null because: 1. Store migration runs on load but may not persist immediately 2. Race conditions or file mtime issues can skip migration 3. computeJobNextRunAtMs/computeNextRunAtMs only checked `at`, not `atMs` Fix: Make both functions defensive by checking `atMs` first (number), then `atMs` (string, for edge cases), then falling back to `at` (string). This ensures jobs fire correctly even if: - Migration hasn't run yet - Old data was written by a previous version - The store was manually edited Fixes #9930 * fix: validate numeric atMs to prevent NaN/Infinity propagation Addresses review feedback - numeric atMs values are now validated with Number.isFinite() && atMs > 0 before use. This prevents corrupted or manually edited stores from causing hot timer loops via setTimeout(..., NaN). * fix(exec-approvals): coerce bare string allowlist entries to objects (#9790) * fix(exec-approvals): coerce bare string allowlist entries (#9903) (thanks @mcaxtr) * security: add skill/plugin code safety scanner (#9806) * security: add skill/plugin code safety scanner module * security: integrate skill scanner into security audit * security: add pre-install code safety scan for plugins * style: fix curly brace lint errors in skill-scanner.ts * docs: add changelog entry for skill code safety scanner * style: append ellipsis to truncated evidence strings * fix(security): harden plugin code safety scanning * fix: scan skills on install and report code-safety details * fix: dedupe audit-extra import * fix(security): make code safety scan failures observable * fix(test): stabilize smoke + gateway timeouts (#9806) (thanks @abdelsfane) --------- Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu> Co-authored-by: Darshil <81693876+dvrshil@users.noreply.github.com> Co-authored-by: George Pickett <gpickett00@gmail.com> * Thinking: accept extra-high alias and sync Codex FAQ wording * Changelog: note #9976 thinking alias + Codex 5.3 docs sync * fix: normalize xhigh aliases and docs sync (#9976) * fix(agents): skip tool extraction for aborted/errored assistant messages (#4598) Fixes tool call/tool_result pairing issues that cause permanent session corruption when assistant messages have stopReason "error" or "aborted". Includes 4 unit tests. * fix(cron): handle undefined sessionTarget in list output (#9649) (#9752) * fix(cron): handle undefined sessionTarget in list output (#9649) When sessionTarget is undefined, pad() would crash with 'Cannot read properties of undefined (reading trim)'. Use '-' as fallback value. * test(cron): add regression test for undefined sessionTarget (#9649) Verifies that printCronList handles jobs with undefined sessionTarget without crashing. Test fails on main branch, passes with the fix. * fix: use correct CronSchedule format in tests (#9752) (thanks @lailoo) Tests were using { kind: 'at', atMs: number } but the CronSchedule type requires { kind: 'at', at: string } where 'at' is an ISO date string. --------- Co-authored-by: damaozi <1811866786@qq.com> Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> * chore: Update deps. * Model: add strict gpt-5.3-codex fallback for OpenAI Codex (fixes #9989) (#9995) * Model: allow forward-compatible OpenAI Codex GPT-5 IDs * Model: scope Codex fallback to gpt-5.3-codex * fix: reorder codex fallback before providerCfg, add ordering test, changelog (#9989) (thanks @w1kke) --------- Co-authored-by: Robin <4robinlehmann@gmail.com> * fix(nextcloud-talk): sign message text instead of JSON body (#2092) Nextcloud Talk's ChecksumVerificationService verifies HMAC against the extracted message/reaction text, not the full JSON body. This fixes 401 authentication errors when sending messages via the bot API. - sendMessageNextcloudTalk: sign 'message' text only - sendReactionNextcloudTalk: sign 'reaction' string only * fix(slack): add mention stripPatterns for /new and /reset commands (#9971) * fix(slack): add mention stripPatterns for /new and /reset commands Fixes #9937 The Slack dock was missing mentions.stripPatterns that Discord has. This caused /new and /reset to fail when sent with a mention (e.g. @bot /reset) because <@USERID> wasn't stripped before matching. * fix(slack): strip mentions for /new and /reset (#9971) (thanks @ironbyte-rgb) --------- Co-authored-by: ironbyte-rgb <amontaboi76@gmail.com> Co-authored-by: George Pickett <gpickett00@gmail.com> * feat(feishu): replace built-in SDK with community plugin Replace the built-in Feishu SDK with the community-maintained clawdbot-feishu plugin by @m1heng. Changes: - Remove src/feishu/ directory (19 files) - Remove src/channels/plugins/outbound/feishu.ts - Remove src/channels/plugins/normalize/feishu.ts - Remove src/config/types.feishu.ts - Remove feishu exports from plugin-sdk/index.ts - Remove FeishuConfig from types.channels.ts New features in community plugin: - Document tools (read/create/edit Feishu docs) - Wiki tools (navigate/manage knowledge base) - Drive tools (folder/file management) - Bitable tools (read/write table records) - Permission tools (collaborator management) - Emoji reactions support - Typing indicators - Rich media support (bidirectional image/file transfer) - @mention handling - Skills for feishu-doc, feishu-wiki, feishu-drive, feishu-perm Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(feishu): add targeted eslint-disable comments for SDK integration Add line-specific eslint-disable-next-line comments for SDK type casts and union type issues, rather than file-level disables. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(feishu): fix webhook mode silent exit and receive_id_type default - monitor.ts: throw error for webhook mode instead of silently returning, so gateway properly marks channel as failed - targets.ts: default receive_id_type to "user_id" instead of "open_id" for non-prefixed IDs, fixing message delivery for enterprise user IDs Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * chore: update pnpm-lock.yaml for feishu extension deps Add lockfile entries for: - @larksuiteoapi/node-sdk@^1.56.1 - @sinclair/typebox@0.34.47 - zod@^4.3.6 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * feat(feishu): sync with clawdbot-feishu #137 (multi-account support) - Sync latest changes from clawdbot-feishu including multi-account support - Add eslint-disable comments for SDK-related any types - Remove unused imports - Fix no-floating-promises in monitor.ts Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * security: redact credentials from config.get gateway responses (#9858) * security: add skill/plugin code safety scanner module * security: integrate skill scanner into security audit * security: add pre-install code safety scan for plugins * style: fix curly brace lint errors in skill-scanner.ts * docs: add changelog entry for skill code safety scanner * security: redact credentials from config.get gateway responses The config.get gateway method returned the full config snapshot including channel credentials (Discord tokens, Slack botToken/appToken, Telegram botToken, Feishu appSecret, etc.), model provider API keys, and gateway auth tokens in plaintext. Any WebSocket client—including the unauthenticated Control UI when dangerouslyDisableDeviceAuth is set—could read every secret. This adds redactConfigSnapshot() which: - Deep-walks the config object and masks any field whose key matches token, password, secret, or apiKey patterns - Uses the existing redactSensitiveText() to scrub the raw JSON5 source - Preserves the hash for change detection - Includes 15 test cases covering all channel types * security: make gateway config writes return redacted values * test: disable control UI by default in gateway server tests * fix: redact credentials in gateway config APIs (#9858) (thanks @abdelsfane) --------- Co-authored-by: George Pickett <gpickett00@gmail.com> * fix: release session locks on process termination (#1962) Adds cleanup handlers to release held file locks when the process terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned lock files that would block future sessions. Fixes #1951 * fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support (#9870) * fix(ollama): add streaming config and fix OLLAMA_API_KEY env var support Adds configurable streaming parameter to model configuration and sets streaming to false by default for Ollama models. This addresses the corrupted response issue caused by upstream SDK bug badlogic/pi-mono#1205 where interleaved content/reasoning deltas in streaming responses cause garbled output. Changes: - Add streaming param to AgentModelEntryConfig type - Set streaming: false default for Ollama models - Add OLLAMA_API_KEY to envMap (was missing, preventing env var auth) - Document streaming configuration in Ollama provider docs - Add tests for Ollama model configuration Users can now configure streaming per-model and Ollama authentication via OLLAMA_API_KEY environment variable works correctly. Fixes #8839 Related: badlogic/pi-mono#1205 * docs(ollama): use gpt-oss:20b as primary example Updates documentation to use gpt-oss:20b as the primary example model since it supports tool calling. The model examples now show: - gpt-oss:20b as the primary recommended model (tool-capable) - llama3.3 and qwen2.5-coder:32b as additional options This provides users with a clear, working example that supports OpenClaw's tool calling features. * chore: remove unused vi import from ollama test * fix: untrack dist/control-ui build artifacts (#1856) The dist/control-ui/ files were committed before the dist/ gitignore rule was effective. These build artifacts get regenerated during builds, causing dirty repo errors that block the auto-update mechanism. Removes the files from git tracking while keeping them locally and respecting the existing dist/ gitignore entry. Fixes #1838 Co-authored-by: Claude <noreply@anthropic.com> * chore: add weekly upstream sync workflow Merges openclaw/openclaw main on a weekly schedule using -X ours so our fork patches always take priority. Opens a PR for visibility. Co-Authored-By: Claude <noreply@anthropic.com> * feat(gateway): route OpenAI endpoint through dispatchInboundMessage for command support * fix(gateway): remove unused import and add defensive stream close * fix(gateway): add abort on disconnect, finish_reason stop, and changelog * fix(gateway): simplify tautological ternary and split command SSE terminal chunk --------- Co-authored-by: Yeom-JinHo <81306489+Yeom-JinHo@users.noreply.github.com> Co-authored-by: Peter Steinberger <steipete@gmail.com> Co-authored-by: Lucas Kim <ichbinlucas211@gmail.com> Co-authored-by: Val Alexander <68980965+BunsDev@users.noreply.github.com> Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> Co-authored-by: Christian Klotz <hello@christianklotz.co.uk> Co-authored-by: Glucksberg <markuscontasul@gmail.com> Co-authored-by: Ayaan Zaidi <zaidi@uplause.io> Co-authored-by: Yudong Han <hanyd@pku.edu.cn> Co-authored-by: Iranb <49674669+Iranb@users.noreply.github.com> Co-authored-by: Seb Slight <sebslight@gmail.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com> Co-authored-by: Shakker <shakkerdroid@gmail.com> Co-authored-by: Josh Palmer <joshp123@users.noreply.github.com> Co-authored-by: mudrii <mudreac@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: lsh411 <lsh411@gmail.com> Co-authored-by: m1 16 512 <m116512@m1ui-MacBookAir-2.local> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: Victor Mier <victormier@gmail.com> Co-authored-by: f-trycua <f@trycua.com> Co-authored-by: hyf0-agent <ada.20260202@outlook.com> Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com> Co-authored-by: Kelvin Calcano <kelvinr02@hotmail.com> Co-authored-by: M00N7682 <dfjk71@khu.ac.kr> Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com> Co-authored-by: damaozi <1811866786@qq.com> Co-authored-by: cpojer <christoph.pojer@gmail.com> Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com> Co-authored-by: Soumyadeep Ghosh <soumyadeepghosh617@gmail.com> Co-authored-by: Clawdbot <lukavyi@me.com> Co-authored-by: 大猫子 <ll1042668699@gmail.com> Co-authored-by: Rajat Joshi <78920780+18-RAJAT@users.noreply.github.com> Co-authored-by: Michael Lee <5957298+TinyTb@users.noreply.github.com> Co-authored-by: Slurpy <slurpy@openclaw.ai> Co-authored-by: 九灵云 <server@jiulingyun.cn> Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com> Co-authored-by: Caelum <subasiarhan3@gmail.com> Co-authored-by: MattQ <115874885+mattqdev@users.noreply.github.com> Co-authored-by: Omar Khaleel <bmw15925@gmail.com> Co-authored-by: Vincent Koc <vincentkoc@ieee.org> Co-authored-by: vincentkoc <vincentkoc@users.noreply.github.com> Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com> Co-authored-by: Markus Glucksberg <markus@glucksberg.com> Co-authored-by: Shrinija Kummari <shrinija@justpaid.ai> Co-authored-by: George Pickett <gpickett00@gmail.com> Co-authored-by: nicolasstanley <60584925+nicolasstanley@users.noreply.github.com> Co-authored-by: Daijiro Miyazawa <dxd5001@gmail.com> Co-authored-by: Igor Markelov <pycckuu@users.noreply.github.com> Co-authored-by: Maksym Brashchenko <39818683+j2h4u@users.noreply.github.com> Co-authored-by: fujiwara-tofu-shop <fujiwara@foundnone.xyz> Co-authored-by: Marcus Castro <mcaxtr@gmail.com> Co-authored-by: Abdel Sy Fane <32418586+abdelsfane@users.noreply.github.com> Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu> Co-authored-by: Darshil <81693876+dvrshil@users.noreply.github.com> Co-authored-by: slonce70 <slonce70@gmail.com> Co-authored-by: Aisling Cahill <aisling@telnyx.com> Co-authored-by: Robin <4robinlehmann@gmail.com> Co-authored-by: wangai-studio <256938352+wangai-studio@users.noreply.github.com> Co-authored-by: ironbyte-rgb <amtaboi76@gmail.com> Co-authored-by: ironbyte-rgb <amontaboi…
IxiAngel
pushed a commit
to subsubl/openclaw
that referenced
this pull request
Feb 21, 2026
Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Draft: Added spixi_add_contact agent tool and runtime interface Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram fix(spixi): add configSchema to plugin export for web UI visibility fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link chore(spixi): simplify Spixi Wallet label in onboarding feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts feat(spixi): finalize integration, fix message dispatch fix(gateway): implement session persistence and reply loop for channels fix(gateway): populate session defaults (model, policy) for new channel sessions fix(gateway): enforce allow sendPolicy and add logging for channel sessions fix(spixi): expose sendMessage capability and improve session type safety fix(spixi): refactor startAccount lifecycle to prevent zombie connections feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. fix(spixi): address code review comments (gateway imports, reply routing, account config) Fix duplicate SpixiConfigSchema identifier and sync with upstream Feat/spixi (#1) * Draft: Added spixi_add_contact agent tool and runtime interface * Complete Native Spixi Plugin: Added account resolution, MQTT listener, and QuIXI API integration * Security & UX: Added configuration schema with dependency warnings for QuIXI and MQTT * Plugin Evolution: Implemented inbound relay logic and added QuIXI repo link to settings * Draft: Integrated Spixi as a first-class channel. Added core registry metadata, configuration types, and Zod schemas. * Fix build errors: resolve Spixi identifier conflict and add spixi to DOCKS * fix(spixi): add configSchema to plugin manifest Fixes 'plugin manifest requires configSchema' error by adding: - channels field to identify spixi as a channel plugin - configSchema with JSON Schema for all Spixi config options * fix(spixi): enable plugin discovery and remove unused field - Add openclaw.extensions to package.json for plugin discovery - Add type: module to match other plugins - Remove unused openclawRecipient field from config schema * feat(spixi): add onboarding support for TUI setup wizard - Create onboarding.ts with full adapter (getStatus, configure, dmPolicy) - Add onboarding property to spixiPlugin in channel.ts - Prompts for MQTT host/port, QuIXI API URL, and wallet address * feat(spixi): implement QuIXI API and add documentation - Fix runtime.ts to use GET requests per QuIXI API docs - Add setSpixiBaseUrl() for configurable API URL - Wire up quixiApiUrl from config in gateway startup - Replace WHY_SPIXI.md with professional README.md - Add setup instructions, configuration reference, architecture diagram * fix(spixi): add configSchema to plugin export for web UI visibility * fix(spixi): add openclaw.channel metadata for UI catalog visibility - Add channel block to package.json with id, label, selectionLabel, etc. - This is required for the channel to appear in the web UI * fix(spixi): add configured field and isConfigured for UI visibility - Add configured field to ResolvedSpixiAccount type - Calculate configured based on mqttHost/quixiApiUrl/myWalletAddress - Add isConfigured to config block so channel shows in UI when unconfigured * fix(spixi): remove catalog channel metadata to fix npm install prompt Spixi is already in CHAT_CHANNEL_ORDER as a core channel. The openclaw.channel block was causing it to appear in the npm install catalog, triggering incorrect npm install prompts during onboarding. * feat(spixi): add installation links to onboarding prerequisites - Add Mosquitto and Aedes MQTT broker links - Add QuIXI GitHub link - Add Spixi wallet download link * chore(spixi): simplify Spixi Wallet label in onboarding * feat(spixi): auto-sync friends from allowFrom on gateway start - Add getFriendList API to fetch contacts from QuIXI - On gateway start, compare allowFrom with existing friends - Auto-send friend requests for missing contacts - Log sync status for debugging * fix(spixi): correct QuIXI API endpoint to /contacts and add debug logging - Change getFriendList from /getContactList to /contacts - Add debug logging to startAccount for troubleshooting * feat(spixi): implement friend request handling via MQTT and API - Add MQTT listeners for RequestAdd2/AcceptAdd2 - Implement auto-accept for allowed contacts - Add acceptContact API and agent tool - Fix getFriendList to use /contacts endpoint * fix(spixi): ensure runtime API methods are always attached - Fix getSpixiRuntime to attach sendMessage/addContact/etc methods even if runtime is already initialized - Remove temporary debug logging from accounts.ts * feat(spixi): finalize integration, fix message dispatch * fix(gateway): implement session persistence and reply loop for channels * fix(gateway): populate session defaults (model, policy) for new channel sessions * fix(gateway): enforce allow sendPolicy and add logging for channel sessions * fix(spixi): expose sendMessage capability and improve session type safety * fix(spixi): refactor startAccount lifecycle to prevent zombie connections * feat: Standardize Spixi's default MQTT port to 1883 and refine its channel registry labels and blurb. * fix(spixi): address code review comments (gateway imports, reply routing, account config) * fix: enforce owner allowlist for commands * fix: infer --auth-choice from API key flags during non-interactive onboarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> * Fix duplicate SpixiConfigSchema identifier and sync with upstream --------- Co-authored-by: Prometheus (The Mayor) <prometheus@openclaw.ai> Co-authored-by: Yogabook <yogabook@local> Co-authored-by: subsubl <114085822+subsubl@users.noreply.github.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com> Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com> Co-authored-by: f-trycua <f@trycua.com> fixes updated pnpm-lock.yaml fixes fixes fixes fixes fixes fixes fixes fixes fixes fixes pnpm-lock.yaml update pnpm-lock.yaml update pnpm-lock.yaml update rebase fixes Update src/config/types.spixi.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update src/gateway/server.impl.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Update extensions/spixi/src/channel.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
hughdidit
added a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Mar 1, 2026
* fix: restore verbose tool summaries in DM sessions
875b018ea removed onToolResult from dispatch-from-config.ts to prevent
tool summaries leaking into group channels. However, this also broke
verbose tool summaries in DM/private sessions where they are expected.
This restores onToolResult but gates it behind ChatType !== 'group',
so group channels remain unaffected while DM verbose works again.
mirror=false is passed to sendPayloadAsync to avoid duplicating tool
summaries in the session transcript (matching the block reply behavior).
Fixes #2665
(cherry picked from commit f27a5030d898ffd747d394d8c5066a332000ec79)
* fix: exclude native slash commands from onToolResult
Native slash commands (e.g. /verbose, /status) should not emit tool
summaries. Gate onToolResult behind CommandSource !== 'native' in
addition to the existing ChatType !== 'group' check.
Add test for native command exclusion.
(cherry picked from commit c13c39f1214f5acad37eea355fbc41a6df4fff07)
* fix: handle telegram video notes (#2905) (thanks @mylukin)
(cherry picked from commit 4ac7aa4a481503508e8bd2c49d2e71e00fccfe36)
* fix: include AccountId in telegram native command context (#2942) (thanks @Chloe-VP)
(cherry picked from commit fcc53bcf1bca757a2c330e6dab2383adb563aef3)
* fix: use & instead of <> in XML escaping test for Windows NTFS compatibility (#3750)
NTFS does not allow < or > in filenames, causing the XML filename
escaping test to fail on Windows CI with ENOENT.
Replace file<test>.txt with file&test.txt — & is valid on all platforms
and still requires XML escaping (&), preserving the test's intent.
Fixes #3748
(cherry picked from commit c20035094ddf95d3186429e88c1b753b99edc36b)
* fix: avoid silent telegram empty replies (#3796) (#3796)
(cherry picked from commit 718bc3f9c818a3521c675a58d8d2942c51d39f4e)
# Conflicts:
# CHANGELOG.md
# src/telegram/bot-native-commands.ts
# src/telegram/bot/delivery.ts
* fix: preserve reasoning tags inside code blocks (#4118) (thanks @vinaygit18)
(cherry picked from commit 4583f88626f20efedc454d893afaaf898c23523b)
# Conflicts:
# CHANGELOG.md
* fix: update config types
(cherry picked from commit d47b4e6f8127e698a9fa6263c0f6a0df93a88b40)
# Conflicts:
# src/commands/onboard-auth.config-core.ts
# src/plugins/config-state.ts
* fix: migrate legacy gateway services
(cherry picked from commit 02576615cb4c1382abf1d0aee10ed10f1f676e78)
# Conflicts:
# docs/providers/xiaomi.md
# package.json
# src/cli/banner.ts
# src/commands/doctor-gateway-services.ts
# src/commands/doctor.ts
# src/commands/onboard-helpers.ts
# src/daemon/inspect.ts
* fix: migrate legacy config
(cherry picked from commit a155e2f8ae32e0b8aa82daa1a546ebfa3b6f9124)
# Conflicts:
# src/commands/doctor-config-flow.ts
* fix: migrate legacy state dirs
(cherry picked from commit 9886fd1a5a3f1e07817865dbf4c1663a919749e3)
# Conflicts:
# package.json
# src/commands/onboard-helpers.ts
# src/config/paths.ts
* fix: migrate symlinked legacy state dirs
(cherry picked from commit b9afa3d33f97f86f7ee9e841719b877e887b76b1)
# Conflicts:
# package.json
# src/infra/state-migrations.ts
* fix: detect legacy gateway launchd labels
(cherry picked from commit 151ddd624bd368e6f4345207c8ea7d9e6521a619)
# Conflicts:
# package.json
* fix: scope telegram skill commands per bot (#4360) (thanks @robhparker)
(cherry picked from commit 9025da2296c11829bf48f0f38c434d6a0ce82fa3)
# Conflicts:
# src/telegram/bot-native-commands.ts
* fix: honor Telegram proxy dispatcher (#4456) (thanks @spiceoogway)
(cherry picked from commit 3a85cb18330ef7b426668191d0acb7ec7b6a86cf)
# Conflicts:
# CHANGELOG.md
* fix: accept numeric Telegram react ids (#4533) (thanks @Ayush10)
(cherry picked from commit bc432d8435214b3a00556f64a4a7ecd2f2ba7616)
# Conflicts:
# README.md
* fix: add docker ui install changelog entry (#4584) (thanks @obviyus)
(cherry picked from commit fa9ec6e85452a81d21fcb046c770e519a16e8dda)
# Conflicts:
# CHANGELOG.md
* fix: correct telegram html nesting (#4578) (thanks @ThanhNguyxn)
(cherry picked from commit da71eaebd2f613f8afaddccdff12cb28c1d7e0f4)
# Conflicts:
# CHANGELOG.md
# src/markdown/render.ts
# src/telegram/format.test.ts
* fix: don't warn about expired OAuth tokens with valid refresh tokens (#4593)
OAuth credentials with a refresh token auto-renew on first API call,
so the doctor should not warn about access token expiration when a
refresh token is present. This avoids unnecessary "expired" warnings
that prompt users to re-auth when no action is needed.
Fixes #3032
Co-authored-by: Ayush Ojha <ayushozha@outlook.com>
(cherry picked from commit 37e295fc029070a214e2690d08429791fcac1512)
* fix: local updates for PR #4780
Co-authored-by: jlowin <jlowin@users.noreply.github.com>
(cherry picked from commit f24e3cdae539b985593626e282a9404b9a00c917)
# Conflicts:
# src/cli/models-cli.ts
# src/commands/models/list.status-command.ts
# src/commands/models/list.status.test.ts
* fix: add per-agent models status (#4780) (thanks @jlowin)
(cherry picked from commit daf27dd37e99cb19b3d169569591a162d5547712)
# Conflicts:
# CHANGELOG.md
* fix: local updates for PR #4873
Co-authored-by: Hisleren <Hisleren@users.noreply.github.com>
(cherry picked from commit e5a95b5b66113b145dbf2f80cc082c269a73728e)
# Conflicts:
# src/commands/configure.gateway.ts
# src/wizard/onboarding.gateway-config.ts
* fix: prevent undefined gateway token defaults (#4873) (thanks @Hisleren)
Co-authored-by: Hisleren <Hisleren@users.noreply.github.com>
(cherry picked from commit 39eb0b7bc0c2594620a7d2eff34f07d987845528)
# Conflicts:
# CHANGELOG.md
* fix: resolve Control UI assets for global installs (#4909) (thanks @YuriNachos)
Co-authored-by: YuriNachos <YuriNachos@users.noreply.github.com>
(cherry picked from commit 34bdbdb4050dfc2bea27085e058e629060a1c8a4)
# Conflicts:
# CHANGELOG.md
# src/infra/control-ui-assets.ts
* fix: prefer requesterOrigin over stale session entry in subagent announce routing (#4957)
* fix: prefer requesterOrigin over stale session entry in subagent announce routing
When a subagent finishes and announces results back, resolveAnnounceOrigin
merged the session entry (primary) with requesterOrigin (fallback). If the
session store had a stale lastChannel (e.g. whatsapp) from a previous
interaction but the user was now on a different channel (e.g. bluebubbles),
the announce would route to the wrong channel.
Swap the merge order so requesterOrigin (captured at spawn time, reflecting
the actual current channel) takes priority, with the session entry as
fallback for any missing fields.
Error before fix:
Delivery failed (whatsapp to bluebubbles:chat_guid:...): Unknown channel: whatsapp
Adds regression test for the stale-channel scenario.
* fix: match test to exact failure scenario and improve reliability (#4957) (thanks @tyler6204)
- Remove lastTo from stale session store to match the exact mismatch scenario described in the PR
- Replace 5ms setTimeout sleeps with expect.poll for better test reliability
- Prevents flakiness on slower CI machines
(cherry picked from commit 57248a7ca120b1083005f37a833ffebcddbd45d8)
* fix: normalize telegram account token lookup (#5055) (thanks @jasonsschin)
(cherry picked from commit e849df64dcce9721844cc1f92fcd427ead210c31)
# Conflicts:
# CHANGELOG.md
# src/telegram/token.ts
* fix: preserve delivery thread fallback (#4911) (thanks @yevhen)
(cherry picked from commit 310eed825e92448552bea310236ff82b93660699)
# Conflicts:
# src/config/sessions/store.ts
# src/utils/delivery-context.test.ts
# src/utils/delivery-context.ts
* fix: suppress banner and doctor checks for completion command
(cherry picked from commit 48aaf6ce4eb3f6233391a6a1ba35a4d0555747fd)
* fix: remove unused variables and fix template literal type
(cherry picked from commit 3c8fa0f9130bca7fa97ab48d36fcad8c3eb8e13d)
# Conflicts:
# src/cli/completion-cli.ts
* fix: repair docker build typing
(cherry picked from commit e9f0be06eb6da3c62f22203f15945d81ce9e286b)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-model-discovery.ts
* fix: align embedded session setup with sdk
(cherry picked from commit d2a852b982fbc92941db8999a8482fc8d19ea2f3)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/commands/models.list.test.ts
* fix: restore embedded extension discovery typings
(cherry picked from commit 51e72d41c29e861b24784c8e29b14849a906b181)
* fix: restore tsc build and plugin install tests
(cherry picked from commit a42e1c82d9ac256fe3a6ffd448e1c7d7a6bb406b)
# Conflicts:
# src/agents/bash-tools.exec.ts
# src/agents/model-scan.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/agents/skills.ts
# src/agents/subagent-announce.ts
# src/auto-reply/reply/commands-subagents.ts
# src/cli/nodes-cli/register.status.ts
# src/discord/resolve-channels.ts
# src/wizard/onboarding.gateway-config.ts
# tsconfig.json
* fix: lint cleanups
(cherry picked from commit ee26b68fe17505e6872e1a3b43384c6138f25da9)
# Conflicts:
# src/auto-reply/reply/commands-subagents.ts
# src/discord/resolve-channels.ts
* fix: Also build `entry.ts` into `dist/entry.mjs`.
(cherry picked from commit ed65131c1cb813ff396b99884dac9e789ce65a81)
# Conflicts:
# package.json
# src/daemon/program-args.test.ts
# src/infra/control-ui-assets.ts
# src/infra/gateway-lock.ts
# src/infra/ports.test.ts
* fix: Update a few more `entry.js` to `entry.mjs` paths.
(cherry picked from commit 4b7406719cf785975835d8dae1c8c20bb98daea0)
* fix: Fix `scripts/watch-node.mjs` and use `tsdown --watch`.
(cherry picked from commit 68ba1afb34ee97b045e02d7a175102182f4210ed)
# Conflicts:
# package.json
# scripts/watch-node.mjs
* fix: resolve workspace templates from package root
(cherry picked from commit ddc5683c675d77427a06a3fb8b79b186e9723a2e)
# Conflicts:
# src/cli/gateway-cli/dev.ts
* fix: retry gateway watch after dist rebuild
(cherry picked from commit e25fedf9321e924f15313c7a88d050de95f5e3ff)
# Conflicts:
# scripts/watch-node.mjs
* fix: Update `CONTRIBUTING.md` + adjust `watch-node.mjs` again to be faster with `tsc`.
(cherry picked from commit dae00fe18450b6b2eb5dd6981d6b4ea80dce0091)
# Conflicts:
# CONTRIBUTING.md
# scripts/watch-node.mjs
* fix: sync docker-compose gateway command
(cherry picked from commit c3a8a5374f17c43cbf855dd49847ed2084fbe945)
# Conflicts:
# docker-compose.yml
* fix: avoid stderr backpressure in macOS discovery (#3304) (thanks @abhijeet117)
(cherry picked from commit b9b94715fa0b0bc0fff1ecf5e8e4665c1084ad9c)
# Conflicts:
# CHANGELOG.md
# apps/macos/Sources/MoltbotDiscovery/WideAreaGatewayDiscovery.swift
* fix: restore telegram draft streaming partials
(cherry picked from commit 37721ebd7ca95205973023947016cc772aed4a27)
# Conflicts:
# src/telegram/bot-message-dispatch.ts
# src/telegram/bot.ts
* fix: harden telegram streaming state
(cherry picked from commit a64d8d2d66eac8a5fe8b7c8305cd6b0d839d786f)
# Conflicts:
# src/telegram/draft-stream.ts
* fix: stabilize partial streaming filters
(cherry picked from commit b5c2b1880d8ccb50d1c61950bf6c2a6ec333c219)
* fix: restore telegram draft streaming partials (#5543) (thanks @obviyus)
(cherry picked from commit f1de88c198d84a1b15c646fa6fc717cfdfe2e672)
# Conflicts:
# CHANGELOG.md
* fix: Failing tests due to import sorting.
(cherry picked from commit 58f4185925a6b73d99d42cd3e6da86fb71c22d17)
# Conflicts:
# docs/channels/discord.md
# src/discord/monitor/native-command.ts
# src/discord/monitor/sender-identity.ts
* fix: skip extension append if command already has one
Addresses review feedback - now checks path.extname() before
appending .cmd to avoid producing invalid paths like npm.cmd.cmd
(cherry picked from commit dc8a63cb8bb325228779dce4f2813b0612d4e139)
# Conflicts:
# src/process/exec.ts
* fix: resolve Windows npm spawn ENOENT (#5815) (thanks @thejhinvirtuoso)
(cherry picked from commit 3d5c03ec29ebe60e3d6a46151e4034e3ee5edcfe)
# Conflicts:
# CHANGELOG.md
* fix(tui): prevent crash when searching with digits in model selector
highlightMatch() was replacing tokens inside ANSI escape codes,
corrupting sequences like [38;2;123;127;135m when searching for '2'.
Fix: apply highlighting to plain text before theme styling.
(cherry picked from commit c621c80afcfd6bfb42e4645a129da051fd5d7d2b)
* fix: use telegram user id for pairing request
(cherry picked from commit 633f8484815afa2f23f94dcf1be4cba0d0d97aa0)
# Conflicts:
# src/telegram/bot-message-context.ts
* fix: use shared pairing store for telegram (#6127) (thanks @obviyus)
(cherry picked from commit 1f3afa38e8d7d67f2aa9392e81ae88521c577adf)
* fix: secure chrome extension relay cdp
(cherry picked from commit a1e89afcc19efd641c02b24d66d689f181ae2b5c)
# Conflicts:
# src/browser/cdp.helpers.ts
# src/browser/extension-relay.ts
* fix: friendlier Windows onboarding message (#6242)
Co-authored-by: CLAWDINATOR <clawdinator@openclaw.ai>
Co-authored-by: Scott Hanselman <scott@hanselman.com>
(cherry picked from commit b897389b877a9d3a92cbc02c77f8c30d54d35337)
# Conflicts:
# src/commands/onboard.ts
* fix: update compaction safeguard to respect context window tokens
(cherry picked from commit 5d3c898a9496670f876a03cbd8368a9833f84148)
* fix: cap context window resolution (#6187) (thanks @iamEvanYT)
(cherry picked from commit 0992c5a8094316f26138ccb0c39b7cee7b0fceb8)
# Conflicts:
# docs/concepts/session-pruning.md
# src/agents/context-window-guard.ts
* fix: satisfy lint curly rule (#6310)
* fix: satisfy lint curly rule
* docs: apply oxfmt formatting
(cherry picked from commit e9f70e858563695c2f9013fb38dba10fb01d239b)
# Conflicts:
# docs/.i18n/README.md
# docs/concepts/session-pruning.md
# docs/zh-CN/index.md
# docs/zh-CN/start/getting-started.md
# docs/zh-CN/start/wizard.md
* fix: cover OpenRouter attribution headers
(cherry picked from commit 083ec9325e4195633bff306a6f8c42998a1b6123)
# Conflicts:
# src/agents/pi-embedded-runner/extra-params.ts
* fix: align embedded agent session setup
(cherry picked from commit bcde2fca5a100e9e540c7485ce56b50e44d17029)
# Conflicts:
# src/agents/auth-profiles/oauth.ts
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: wire before_tool_call hook into tool execution (#6570) (thanks @ryancnelson) (#6660)
(cherry picked from commit 8eb11bd3044a21eb6ce76e8a451ae94ec4ab0549)
# Conflicts:
# CHANGELOG.md
# README.md
# src/agents/pi-embedded-subscribe.handlers.tools.ts
* fix: align embedded runner with session API changes
(cherry picked from commit 3367b2aa272f7626b3b2157c5f2ca8792a4f4d1a)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: harden host exec env validation (#4896) (thanks @HassanFleyah)
(cherry picked from commit a87a07ec8ada6e17d434306247b6258cb76eba68)
# Conflicts:
# CHANGELOG.md
# src/agents/bash-tools.exec.ts
* fix: clean up plugin linting and types
(cherry picked from commit 19775abdda11c4066c308752894fad156b9aeef4)
# Conflicts:
# .oxlintrc.json
# extensions/googlechat/src/accounts.ts
# extensions/line/src/channel.ts
* fix: align embedded runner with pi-coding-agent API
(cherry picked from commit e58291e070108aaffc36412d1ed71d01d64ed9c3)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/agents/pi-embedded-runner/run/attempt.ts
* fix: refine oauth provider guard
(cherry picked from commit 7aeabbabd46d544a23704732fc526e7355633856)
* fix: align pi-coding-agent typings and docs
(cherry picked from commit aa2eb48b9c0fe63aa7b8be6329869d3a2539c446)
# Conflicts:
# docs/pi.md
* fix: format issues and lint error in oauth.ts
(cherry picked from commit 4347d2468c37be54fe51ba4e4df0de502d4c87c3)
# Conflicts:
# CHANGELOG.md
# docs/nodes/index.md
# docs/providers/moonshot.md
* fix: convert HTML comments to MDX comments in docs
(cherry picked from commit 7ee99af9f892e7a6be9888e88d9b055fc8100d8c)
# Conflicts:
# docs/concepts/model-providers.md
* fix: format docs
(cherry picked from commit dda8a2b23848695b834fb77f95c34a022740917a)
# Conflicts:
# docs/concepts/model-providers.md
* fix: L2-normalize local embedding vectors to fix semantic search (#5332)
* fix: L2-normalize local embedding vectors to fix semantic search
* fix: handle non‑finite magnitude in L2 normalization and remove stale test reset
* refactor: add braces to l2Normalize guard clause in embeddings
* fix: sanitize local embeddings (#5332) (thanks @akramcodez)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit 5020bfa2a9bdad33e79d5ae04e0b6a74a457485a)
# Conflicts:
# src/memory/embeddings.ts
* fix: unify telegram thread handling
(cherry picked from commit 19b8416a8108bc997cec1c1bc020a12389ae4739)
# Conflicts:
# src/telegram/bot-native-commands.ts
# src/telegram/bot/delivery.ts
* fix: require thread specs for telegram sends
(cherry picked from commit 1d7dd5f261492b4cfd0219871abbfcb8a975b6ac)
* fix: inline telegram thread scope type
(cherry picked from commit 0bc8a592a6ad47de0674396b3e1c2dc30159fedb)
* fix: add changelog for telegram thread spec (#6833) (thanks @obviyus)
(cherry picked from commit e25f8ed56c3dad7a79a5277ae8e633ce1bd732da)
# Conflicts:
# CHANGELOG.md
* fix: add telegram download timeouts (#6914) (thanks @hclsys)
(cherry picked from commit 01449a2f4158fed111807978424e20b7d5cf8b54)
* fix: treat '*' tool allowlist as valid
(cherry picked from commit 521b12181571c5cc2575389cc24a4c1eef8d2b67)
# Conflicts:
# CHANGELOG.md
* fix: flush block streaming on paragraph boundaries for chunkMode=newline (#7014)
* feat: Implement paragraph boundary flushing in block streaming
- Added `flushOnParagraph` option to `BlockReplyChunking` for immediate flushing on paragraph breaks.
- Updated `EmbeddedBlockChunker` to handle paragraph boundaries during chunking.
- Enhanced `createBlockReplyCoalescer` to support flushing on enqueue.
- Added tests to verify behavior of flushing with and without `flushOnEnqueue` set.
- Updated relevant types and interfaces to include `flushOnParagraph` and `flushOnEnqueue` options.
* fix: Improve streaming behavior and enhance block chunking logic
- Resolved issue with stuck typing indicator after streamed BlueBubbles replies.
- Refactored `EmbeddedBlockChunker` to streamline fence-split handling and ensure maxChars fallback for newline chunking.
- Added tests to validate new chunking behavior, including handling of paragraph breaks and fence scenarios.
- Updated changelog to reflect these changes.
* test: Add test for clamping long paragraphs in EmbeddedBlockChunker
- Introduced a new test case to verify that long paragraphs are correctly clamped to maxChars when flushOnParagraph is enabled.
- Updated logic in EmbeddedBlockChunker to handle cases where the next paragraph break exceeds maxChars, ensuring proper chunking behavior.
* refactor: streamline logging and improve error handling in message processing
- Removed verbose logging statements from the `processMessage` function to reduce clutter.
- Enhanced error handling by using `runtime.error` for typing restart failures.
- Updated the `applySystemPromptOverrideToSession` function to accept a string directly instead of a function, simplifying the prompt application process.
- Adjusted the `runEmbeddedAttempt` function to directly use the system prompt override without invoking it as a function.
(cherry picked from commit 9ef24fd400ba60bdca7cc9ab0e2d64a839c54f21)
# Conflicts:
# CHANGELOG.md
# docs/channels/bluebubbles.md
# extensions/bluebubbles/src/monitor.ts
# src/agents/pi-embedded-block-chunker.ts
# src/auto-reply/reply/block-reply-coalescer.ts
* fix: restore lint/build gates
(cherry picked from commit 34dd7324d90cbf26370181cfcb5382422f082763)
# Conflicts:
# .oxlintrc.json
# package.json
# src/agents/auth-profiles/oauth.ts
# src/agents/pi-embedded-runner/system-prompt.ts
* fix: harden plugin and hook install paths
(cherry picked from commit d03eca8450dc493b198a88b105fd180895238e57)
# Conflicts:
# src/agents/pi-embedded-runner/compact.ts
# src/hooks/install.ts
# src/plugins/install.test.ts
# src/plugins/install.ts
* fix: gate Teams media auth retries
(cherry picked from commit 41cc5bcd4f1d434ad1bbdfa55b56f25025ecbf6b)
# Conflicts:
# docs/channels/msteams.md
# extensions/msteams/src/attachments/download.ts
* fix: resolve system prompt overrides
(cherry picked from commit b8174decf334b1990c9a308b6e4d118a53933fc9)
# Conflicts:
# src/agents/pi-embedded-runner/system-prompt.ts
* fix: align tool execute signature
(cherry picked from commit 284d24209bf6d587c4943bb56ea9d21c3319a22d)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: align tool execute parameter order
(cherry picked from commit 2d317ce423720af020403c2da86faef43e42ba8b)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: align tool definition adapter
(cherry picked from commit 9ae1b732ef69ba880fa681fa41d9d788691b34c8)
# Conflicts:
# docs/install/docker.md
# src/agents/pi-embedded-runner.createsystempromptoverride.test.ts
# src/agents/pi-tool-definition-adapter.ts
* fix: normalize tool execute args
(cherry picked from commit bcb0ed0866c87c4ef1097569ec39890be010716c)
# Conflicts:
# src/agents/pi-tool-definition-adapter.ts
* fix: handle legacy tool execute signatures
(cherry picked from commit 845d97b6a50eecc1e614ee529b6246131c91f6d2)
* fix: satisfy tool adapter lint
(cherry picked from commit bf08b485bde8e66e9bb0a48592326c5f3767d4ef)
* fix: guard remote media fetches with SSRF checks
(cherry picked from commit 81c68f582d4a9a20d9cca9f367d2da9edc5a65ae)
# Conflicts:
# CHANGELOG.md
# src/agents/tools/web-fetch.ts
# src/media/fetch.test.ts
# src/media/fetch.ts
# src/media/input-files.ts
# src/slack/monitor/media.ts
# src/web/media.test.ts
# src/web/media.ts
* fix: start gateway in docker CMD (#6635) (thanks @kaizen403)
(cherry picked from commit 66307695eba71b7da1a03cfa10e770bd4b1c9004)
* fix: polish docker setup flow
(cherry picked from commit dfef943f0a18e05e9c81b82f1e800024f444d276)
# Conflicts:
# docker-setup.sh
* fix: expand SSRF guard coverage
(cherry picked from commit 9bd64c8a1f91dda602afc1d5246a2ff2be164647)
# Conflicts:
# CHANGELOG.md
# src/media-understanding/providers/deepgram/audio.test.ts
# src/media-understanding/providers/openai/audio.test.ts
# src/slack/monitor/media.ts
# src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts
* fix: stabilize docker e2e flows
(cherry picked from commit f9fae2c439bbbe6fcd4305cd2cb2958df5a45473)
# Conflicts:
# scripts/e2e/doctor-install-switch-docker.sh
# scripts/e2e/onboard-docker.sh
# scripts/e2e/plugins-docker.sh
* fix: address review feedback — retryDelay uses effectiveForce, default overrides param, @state() on chatNewMessagesBelow
(cherry picked from commit 822388fe9236abe6e66a4b1b40967fb8d754ce82)
# Conflicts:
# ui/src/ui/app-scroll.test.ts
# ui/src/ui/app-scroll.ts
# ui/src/ui/app.ts
* fix: resolve check errors in nodes-tool and commands-ptt
(cherry picked from commit d3bb32273e1b77e13d05a8d10e97194be94e9806)
# Conflicts:
# src/agents/tools/nodes-tool.ts
# src/auto-reply/reply/commands-ptt.ts
* fix: validate AbortSignal instances before calling AbortSignal.any()
Fixes #7269
(cherry picked from commit a63ec41a7bf53efeea97ab46e2216deb85051c55)
# Conflicts:
# src/agents/pi-tools.abort.ts
* fix: validate AbortSignal instances before calling AbortSignal.any() (#7277) (thanks @Elarwei001)
(cherry picked from commit 5fb8f779ca1e4a5432fc8fd9c0fd243107b95de9)
# Conflicts:
# CHANGELOG.md
# src/agents/pi-tools.abort.ts
* fix: skip audio files from text extraction to prevent binary processing (#7475)
* fix: skip audio files from text extraction early
Audio files should not be processed through extractFileBlocks for text
extraction - they are handled by the dedicated audio transcription
capability (STT).
Previously, audio files were only skipped if they didn't "look like text"
(looksLikeUtf8Text check). This caused issues where some audio binary
data (e.g., long Telegram voice messages) could accidentally pass the
heuristic check and get processed as text content.
This fix:
1. Adds audio to the early skip alongside image/video (more efficient)
2. Removes the redundant secondary check that had the flawed condition
Fixes audio binary being incorrectly processed as text in Telegram and
other platforms.
* Media: skip binary media in file extraction (#7475) (thanks @AlexZhangji)
---------
Co-authored-by: Shakker <shakkerdroid@gmail.com>
(cherry picked from commit f49297e2c116281b9ffc292297e83a1d4781ea33)
# Conflicts:
# CHANGELOG.md
# src/media-understanding/apply.test.ts
# src/media-understanding/apply.ts
* fix: repair malformed tool calls and session transcripts (#7473) (thanks @justinhuangcode)
(cherry picked from commit cfd6b21d0eb6d98c8d122bc897b226ece0751ce2)
# Conflicts:
# CHANGELOG.md
* fix: harden exec allowlist parsing
(cherry picked from commit d1ecb46076145deb188abcba8f0699709ea17198)
# Conflicts:
# src/infra/exec-approvals.ts
* fix: error handling in restore failure reporting
(cherry picked from commit e9f182def70a6a692e258c4529780ad9b2d4c2a0)
# Conflicts:
# src/terminal/restore.ts
* Fix build regressions after merge
(cherry picked from commit 23cfcd60df5418bf16c374cf8132854d3f9b8c45)
# Conflicts:
# src/config/zod-schema.ts
# src/memory/manager.ts
# src/memory/types.ts
* fix: make QMD cache key deterministic
(cherry picked from commit d0b98c75e574852e53894eabd98f5b91ca631c3f)
# Conflicts:
# src/memory/search-manager.ts
* fix: derive citations chat type via session parser
(cherry picked from commit edd6289f26f19b4c03f0626b6295e934eca3ba95)
# Conflicts:
# src/agents/tools/memory-tool.citations.test.ts
# src/agents/tools/memory-tool.ts
* fix: restore session_status and CLI examples
(cherry picked from commit 7d5ca1176d0ef8a7bc4fd50b0b39006b82dcf75f)
* fix: restore safety + session_status hints
(cherry picked from commit afbb1af6c5d875a17b4b63883d3bb7aa42f8e415)
# Conflicts:
# src/agents/system-prompt.ts
* fix: changelog entry for QMD memory (#3160) (thanks @vignesh07)
(cherry picked from commit 1ee57cf7277ec70043dfca8a0747909ab7207950)
# Conflicts:
# CHANGELOG.md
* fix: Remove `tsconfig.oxlint.json` AGAIN.
(cherry picked from commit 425003417dff3a2b57af05bc352f22d9e98b1b15)
# Conflicts:
# .oxlintrc.json
# package.json
# src/media-understanding/providers/google/video.test.ts
# src/telegram/bot.media.downloads-media-file-path-no-file-download.test.ts
# src/web/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts
# src/web/auto-reply.web-auto-reply.falls-back-text-media-send-fails.test.ts
# tsdown.config.ts
* fix: Fix Mac app build step.
(cherry picked from commit be4f7ef361a88cf3a46faf5338d99f1543d32902)
# Conflicts:
# scripts/package-mac-app.sh
* fix: harden Windows exec allowlist
(cherry picked from commit a7f4a53ce80c98ba1452eb90802d447fca9bf3d6)
* fix: restore OpenClaw docs/source links in system prompt
(cherry picked from commit 9d2066bd53f675d525187732c162ec702b433e3d)
# Conflicts:
# src/agents/system-prompt.ts
* fix: harden control ui framing + ws origin
(cherry picked from commit 66d8117d4483df542d450b9f4bb6dd2a2b769046)
# Conflicts:
# src/config/schema.ts
# src/config/types.gateway.ts
# src/config/zod-schema.ts
# src/gateway/control-ui.test.ts
# src/gateway/control-ui.ts
# src/gateway/server/ws-connection/message-handler.ts
* fix: use build-info for version fallback
(cherry picked from commit a9bb96ade321073914f12f640d82e09ffd4cba14)
# Conflicts:
# src/version.ts
* fix: improve build-info resolution for commit/version
(cherry picked from commit e895e85f5488f85e007940b46829d779b04b29f7)
# Conflicts:
# CHANGELOG.md
# package.json
* fix: enforce Nextcloud Talk allowlist by user id
(cherry picked from commit 6b4b6049b47c3329a7014509594647826669892d)
* fix: add legacy daemon-cli shim for updates
(cherry picked from commit 9c5941ba466b86e3056b6743cd6d4fc554b13e8d)
# Conflicts:
# package.json
* fix: honor telegram model overrides in buttons (#8193) (thanks @gildo)
(cherry picked from commit 41a4f1200bb10672ebbf578d29a430342cd7a153)
# Conflicts:
# CHANGELOG.md
# src/telegram/bot-handlers.ts
* fix: keep Moonshot CN base URL in onboarding (#7180) (thanks @waynelwz)
(cherry picked from commit 4a5d36892691ae70b63bbf9dae6fb6b48a4b2553)
# Conflicts:
# CHANGELOG.md
# src/commands/auth-choice.apply.api-providers.ts
# src/commands/onboard-auth.config-core.ts
* fix: harden voice-call webhook verification
(cherry picked from commit a749db9820eb6d6224032a5a34223d286d2dcc2f)
# Conflicts:
# CHANGELOG.md
# extensions/voice-call/src/config.ts
# extensions/voice-call/src/providers/plivo.ts
# extensions/voice-call/src/providers/twilio.ts
# extensions/voice-call/src/runtime.ts
# extensions/voice-call/src/webhook-security.ts
* fix: cron announce delivery path (#8540) (thanks @tyler6204)
(cherry picked from commit 6341819d74c1d9f4664ac40c33fec79b70dd56b9)
# Conflicts:
# docs/automation/cron-jobs.md
# src/cron/isolated-agent.delivers-response-has-heartbeat-ok-but-includes.test.ts
# src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts
# src/cron/isolated-agent/run.ts
# src/cron/service/timer.ts
# ui/src/ui/format.test.ts
* fix: trim legacy signature fallback, type fromChatType as union
(cherry picked from commit b2361292e7a7c12fc2b874b05013ef3183b5597a)
# Conflicts:
# src/telegram/bot/helpers.test.ts
# src/telegram/bot/helpers.ts
* fix: telegram forward metadata + cron delivery guard (#8392) (thanks @Glucksberg)
(cherry picked from commit 78fd1947228634111a4e2a36f2a7e3c13b321998)
# Conflicts:
# CHANGELOG.md
# src/cron/isolated-agent/run.ts
# src/telegram/bot/helpers.ts
* fix: address review comments
- Use optional timeoutMs parameter (undefined = use config/default)
- Extract DEFAULT_IMESSAGE_PROBE_TIMEOUT_MS to shared constants.ts
- Import constant in client.ts instead of hardcoding
- Re-export constant from probe.ts for backwards compatibility
(cherry picked from commit f633a8cb22302fe62ce3b9d541ac991cd2e7bc22)
# Conflicts:
# src/imessage/client.ts
# src/imessage/monitor/monitor-provider.ts
# src/imessage/probe.ts
* fix: align proxy fetch typing
(cherry picked from commit 19ecdce2751d51b177c47341fc3bbe09759e6ec9)
# Conflicts:
# src/telegram/proxy.ts
* fix: force reload cron store
(cherry picked from commit 6f200ea77f2da9d3ec5b520090a578a4c2ce732f)
# Conflicts:
# src/cron/service/store.ts
* fix: cover anonymous voice allowlist callers (#8104) (thanks @victormier) (#9188)
(cherry picked from commit 0cd47d830f8681339ef76a745397866f4fa1c0f4)
# Conflicts:
# CHANGELOG.md
# extensions/voice-call/src/manager.test.ts
* fix: enforce owner allowlist for commands
(cherry picked from commit 385a7eba3376a4ca65093ce42c6d009c49089c40)
# Conflicts:
# src/auto-reply/command-auth.ts
# src/auto-reply/command-control.test.ts
* fix: infer --auth-choice from API key flags during non-interactive onboarding (#9241)
* fix: infer --auth-choice from API key flags during non-interactive onboarding
When --anthropic-api-key (or other provider key flags) is passed without
an explicit --auth-choice, the auth choice defaults to "skip", silently
discarding the API key. This means the gateway starts without credentials
and fails on every inbound message with "No API key found for provider".
Add inferAuthChoiceFromFlags() to derive the correct auth choice from
whichever provider API key flag was supplied, so credentials are persisted
to auth-profiles.json as expected.
Fixes #8481
* fix: infer auth choice from API key flags (#8484) (thanks @f-trycua)
* refactor: centralize auth choice inference flags (#8484) (thanks @f-trycua)
---------
Co-authored-by: f-trycua <f@trycua.com>
(cherry picked from commit 22927b0834926a4188fb248fa2309aa04b1800ff)
# Conflicts:
# CHANGELOG.md
# src/commands/onboard-non-interactive.cloudflare-ai-gateway.test.ts
# src/commands/onboard-non-interactive/local.ts
* fix: gracefully downgrade xhigh thinking level in cron isolated agent (#9363)
When thinkingDefault is set to "xhigh" but the configured model does not
support it (e.g. Claude), the cron isolated-agent path throws a hard error
causing the job to fail. The interactive chat path already handles this by
silently downgrading to "high".
Apply the same graceful downgrade in the cron path: log a warning and
fall back to "high" instead of crashing.
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
(cherry picked from commit 85246664548b4481f2da2b706dd58157484abe86)
* fix: restore discord owner hint from allowlists
(cherry picked from commit d84eb46467d74e12e7fad63ee2a257ad1473fcd8)
# Conflicts:
# CHANGELOG.md
# src/auto-reply/command-auth.ts
# src/auto-reply/command-control.test.ts
# src/auto-reply/templating.ts
# src/discord/monitor/message-handler.process.ts
* fix: remove unused cron import
(cherry picked from commit 3b40227bc677fb50a7931d5cce00a370a5d405b6)
# Conflicts:
# src/cron/isolated-agent/run.ts
* fix: resolve bundled chrome extension assets (#8914) (thanks @kelvinCB)
(cherry picked from commit 1ee1522daad498a322febaa93e6bc66e84ae0fb0)
# Conflicts:
# CHANGELOG.md
# src/cli/browser-cli-extension.test.ts
# src/cli/browser-cli-extension.ts
* fix: stabilize windows acl tests and command auth registry (#9335) (thanks @M00N7682)
(cherry picked from commit d6cde28c8e33f4908f91a4160fbeb331862a5901)
# Conflicts:
# src/security/windows-acl.test.ts
* fix: resolve discord owner allowFrom matches
(cherry picked from commit a4d1af1b1118c08aef0792b88b33f4a24878d8c5)
* fix: preserve telegram DM topic threadId (#9039) (thanks @lailoo)
(cherry picked from commit f2c5c847bd265701fa7ec3966ff5dc96bdddc5b8)
# Conflicts:
# CHANGELOG.md
* fix: update changelog for help sorting (#8068) (thanks @deepsoumya617)
(cherry picked from commit cf95b2f3f41bd1b5fb8024e3bf073df06993f15e)
# Conflicts:
# CHANGELOG.md
* fix: auto-inject Telegram forum topic threadId in message tool
When using Telegram DM topics (forum topics), messages sent via the
message tool (media, buttons, etc.) land in General Topic instead of
the user's current topic. This happens because Slack has
resolveSlackAutoThreadId for auto-threading but Telegram had no
equivalent.
Add resolveTelegramAutoThreadId that mirrors the Slack pattern:
- When channel is telegram and no explicit threadId is provided
- Check if toolContext.currentThreadTs (the topic ID) is set
- Verify the target matches the originating chat
- Inject the threadId into params so the Telegram plugin action
handler picks it up for sendMessage/sendMedia
The subagent announce path already correctly passes threadId via
requesterOrigin (set from agentThreadId in sessions-spawn-tool),
so no changes needed there.
(cherry picked from commit eef247b7a4bcbac0ef43d70f6ecbab5a97dc8a9b)
# Conflicts:
# src/infra/outbound/message-action-runner.ts
* fix: pass threadId/to/accountId from parent to subagent gateway call
When spawning a subagent, the requesterOrigin's threadId, to, and
accountId were not forwarded to the callGateway({method:'agent'}) params.
This meant the subagent's runContext had no currentThreadTs or
currentChannelId, so resolveTelegramAutoThreadId could not auto-inject
the forum topic thread ID when the subagent used the message tool.
Changes:
- sessions-spawn-tool: pass to, accountId, threadId from requesterOrigin
- run-context: populate currentChannelId from opts.to as fallback
Fixes subagent messages landing in General Topic instead of the correct
Telegram DM topic thread.
(cherry picked from commit a13efbe2b5818a2ebf632afa591f94fb8c108a78)
* fix: telegram topic auto-threading — use parseTelegramTarget, add tests (#7235) (thanks @Lukavyi)
(cherry picked from commit 01db1dde1ad77392c96ff0e3d9be72d5146a9e91)
# Conflicts:
# CHANGELOG.md
# src/agents/sessions-spawn-threadid.test.ts
# src/infra/outbound/message-action-runner.threading.test.ts
# src/infra/outbound/message-action-runner.ts
* fix: remove orphaned tool_results during compaction pruning
When pruneHistoryForContextShare drops chunks of messages, it could drop
an assistant message with tool_use blocks while leaving corresponding
tool_result messages in the kept portion. These orphaned tool_results
cause Anthropic's API to reject the session with 'unexpected tool_use_id'.
Fix by calling repairToolUseResultPairing after each chunk drop to clean
up any orphaned tool_results. This reuses existing battle-tested code
from session-transcript-repair.ts.
Fixes #9769, #9724, #9672
(cherry picked from commit f32eeae3bc00ab3e8b6b0e33fe61336449d3b196)
# Conflicts:
# CHANGELOG.md
* fix cron scheduling and reminder delivery regressions (#9733)
* fix(cron): prevent timer from allowing process exit (fixes #9694)
The cron timer was using .unref(), which caused the Node.js event
loop to exit or sleep if no other handles were active. This prevented
cron jobs from firing in some environments.
* fix(cron): infer delivery target for isolated jobs (fixes #9683)
When creating isolated agentTurn jobs (e.g. reminders) without explicit
delivery options, the job would default to 'announce' but fail to
resolve the target conversation. Now, we infer the channel and
recipient from the agent's current session key.
* fix(cron): enhance delivery inference for threaded sessions and null inputs (#9733)
Improves the delivery inference logic in the cron tool to correctly handle threaded session keys and cases where delivery is explicitly set to null. This ensures that the appropriate delivery mode and target are inferred based on the agent's session key, enhancing the reliability of job execution.
* fix: preserve telegram topic delivery inference (#9733) (thanks @tyler6204)
* fix: simplify cron delivery merge spread (#9733) (thanks @tyler6204)
(cherry picked from commit 821520a05718b58bb47c88ba329e3bc01d755514)
# Conflicts:
# src/agents/tools/cron-tool.ts
* fix: clear stale token metrics on /new and /reset (#8929)
When starting a new session via /new or /reset, the token usage fields
(totalTokens, inputTokens, outputTokens, contextTokens) survived from the
previous session via the spread pattern in session init. This caused /status
to display misleading context usage from the old session.
Clear all four token metrics explicitly in the isNewSession block, alongside
the existing compactionCount reset. Also add diagnostic logging for session
forking via ParentSessionKey to help trace context inheritance.
(cherry picked from commit 93b450349f77fa2521c7948a724a6ffdaeaeb09f)
* fix: allow multiple compaction retries on context overflow (#8928)
Previously, overflowCompactionAttempted was a boolean flag set once, preventing
recovery when a single compaction wasn't enough. Change to a counter allowing up
to 3 attempts before giving up. Also add diagnostic logging on overflow events to
help debug early-overflow issues.
Fixes sessions that hit context overflow during long agentic turns with many tool
calls, where one compaction round isn't sufficient to bring context below limits.
(cherry picked from commit 4e1a7cd60cc78ce0b3b1790a2e5b96a7a8deddc4)
* Fix: Enable scrolling on the dashboard config page (#1822)
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
* Fix: Enable scrolling in dashboard
(cherry picked from commit cefd87f3557ce7bee0550050f39349ebe5c8bd10)
* fix: normalize xhigh aliases and docs sync (#9976)
(cherry picked from commit de7b2ba7d523e37521d4acc7cc682dbc5ecebd74)
# Conflicts:
# docs/tools/thinking.md
* fix: release session locks on process termination (#1962)
Adds cleanup handlers to release held file locks when the process
terminates via SIGTERM, SIGINT, or normal exit. This prevents orphaned
lock files that would block future sessions.
Fixes #1951
(cherry picked from commit ec0728b3574f115c83fd458967ea9493f388c647)
* fix: untrack dist/control-ui build artifacts (#1856)
The dist/control-ui/ files were committed before the dist/ gitignore
rule was effective. These build artifacts get regenerated during
builds, causing dirty repo errors that block the auto-update mechanism.
Removes the files from git tracking while keeping them locally and
respecting the existing dist/ gitignore entry.
Fixes #1838
Co-authored-by: Claude <noreply@anthropic.com>
(cherry picked from commit 3ad7958365485db2179fb98658b939206f930ff9)
* fix: wire onToolResult callback for verbose tool summaries (#2022)
HOTFIX: Tool summaries were not being sent to chat channels when verbose mode
was enabled. The onToolResult callback was defined in the types but never
wired up in dispatch-from-config.ts.
This adds the missing callback alongside onBlockReply, using the same
dispatcher.sendBlockReply() path to deliver tool summaries to WhatsApp,
Telegram, and other chat channels.
Fixes verbose tool summaries not appearing in WhatsApp despite /verbose on.
(cherry picked from commit 05b28c147d5d27be3b751d4d7d1d735b21a4296c)
* fix: Gateway canvas host bypasses auth and serves files unauthenticated
(cherry picked from commit 47538bca4d8ac702c7545b218e183fced155dfff)
# Conflicts:
# src/gateway/server-http.ts
* fix: `onToolResult` fallback is not expected.
(cherry picked from commit 8abce8a84dc93ddd474fb7067bcb13a8794805ea)
* fix: Do not `process.exit(0)` in the middle of a test.
(cherry picked from commit f16e32b73d321a0571a16f94ab226487e4f3f060)
* fix: silence unused hook token url param (#9436)
* fix: Gateway authentication token exposed in URL query parameters
* fix: silence unused hook token url param
* fix: remove gateway auth tokens from URLs (#9436) (thanks @coygeek)
* test: fix Windows path separators in audit test (#9436)
---------
Co-authored-by: George Pickett <gpickett00@gmail.com>
(cherry picked from commit 717129f7f9b21dd919a990f06c26008c63863f3d)
# Conflicts:
# docs/gateway/configuration.md
# docs/help/faq.md
# docs/platforms/exe-dev.md
# docs/start/clawd.md
# docs/web/dashboard.md
# src/commands/dashboard.ts
# src/gateway/hooks.ts
# src/gateway/server-http.ts
# src/wizard/onboarding.finalize.ts
# ui/src/ui/app-settings.ts
# ui/src/ui/views/overview.ts
* fix: add fallback for Control UI asset resolution in global installs
(cherry picked from commit 72245855e5fea3dbf1026ea282dcc91e621ace4b)
# Conflicts:
# CHANGELOG.md
# src/infra/control-ui-assets.ts
* fix: remove dead restore control-ui step from update runner
(cherry picked from commit b40da2cb7aa4643c5f3cc36a66b01db9aac6e666)
* fix: CLI harden update restart imports and fix nested bundle version resolution
(cherry picked from commit 4a59b7786be7a98492358b3cc837c1f7cbe40e72)
# Conflicts:
# src/cli/update-cli.ts
# src/version.ts
* fix: guard resolveUserPath against undefined input (#10176)
* fix: guard resolveUserPath against undefined input
When subagent spawner omits workspaceDir, resolveUserPath receives
undefined and crashes on .trim(). Add a falsy guard that falls back
to process.cwd(), matching the behavior callers already expect.
Closes #10089
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: harden runner workspace fallback (#10176) (thanks @Yida-Dev)
* fix: harden workspace fallback scoping (#10176) (thanks @Yida-Dev)
* refactor: centralize workspace fallback classification and redaction (#10176) (thanks @Yida-Dev)
* test: remove explicit any from utils mock (#10176) (thanks @Yida-Dev)
* security: reject malformed agent session keys for workspace resolution (#10176) (thanks @Yida-Dev)
---------
Co-authored-by: Yida-Dev <reyifeijun@gmail.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit 421644940517ae1857281bddf8603aeef9cebf1c)
# Conflicts:
# CHANGELOG.md
# src/agents/cli-runner.test.ts
# src/agents/cli-runner.ts
# src/agents/pi-embedded-runner/run.ts
# src/agents/pi-embedded-runner/run/attempt.ts
# src/auto-reply/reply/agent-runner-execution.ts
# src/commands/status-all/channels.ts
# src/utils.test.ts
* fix(hooks): replace debug console.log with proper subsystem logging in session-memory (#10730)
* fix: replace debug console.log with proper subsystem logging in session-memory
* fix(hooks): normalize session-memory subsystem logging
---------
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
(cherry picked from commit 2c8af78d20d4d1f9d2a1151fc1ff15bfec847a3d)
* fix: cron scheduler reliability, store hardening, and UX improvements (#10776)
* refactor: update cron job wake mode and run mode handling
- Changed default wake mode from 'next-heartbeat' to 'now' in CronJobEditor and related CLI commands.
- Updated cron-tool tests to reflect changes in run mode, introducing 'due' and 'force' options.
- Enhanced cron-tool logic to handle new run modes and ensure compatibility with existing job structures.
- Added new tests for delivery plan consistency and job execution behavior under various conditions.
- Improved normalization functions to handle wake mode and session target casing.
This refactor aims to streamline cron job configurations and enhance the overall user experience with clearer defaults and improved functionality.
* test: enhance cron job functionality and UI
- Added tests to ensure the isolated agent correctly announces the final payload text when delivering messages via Telegram.
- Implemented a new function to pick the last deliverable payload from a list of delivery payloads.
- Enhanced the cron service to maintain legacy "every" jobs while minute cron jobs recompute schedules.
- Updated the cron store migration tests to verify the addition of anchorMs to legacy every schedules.
- Improved the UI for displaying cron job details, including job state and delivery information, with new styles and layout adjustments.
These changes aim to improve the reliability and user experience of the cron job system.
* test: enhance sessions thinking level handling
- Added tests to verify that the correct thinking levels are applied during session spawning.
- Updated the sessions-spawn-tool to include a new parameter for overriding thinking levels.
- Enhanced the UI to support additional thinking levels, including "xhigh" and "full", and improved the handling of current options in dropdowns.
These changes aim to improve the flexibility and accuracy of thinking level configurations in session management.
* feat: enhance session management and cron job functionality
- Introduced passthrough arguments in the test-parallel script to allow for flexible command-line options.
- Updated session handling to hide cron run alias session keys from the sessions list, improving clarity.
- Enhanced the cron service to accurately record job start times and durations, ensuring better tracking of job execution.
- Added tests to verify the correct behavior of the cron service under various conditions, including zero-delay timers.
These changes aim to improve the usability and reliability of session and cron job management.
* feat: implement job running state checks in cron service
- Added functionality to prevent manual job runs if a job is already in progress, enhancing job management.
- Updated the `isJobDue` function to include checks for running jobs, ensuring accurate scheduling.
- Enhanced the `run` function to return a specific reason when a job is already running.
- Introduced a new test case to verify the behavior of forced manual runs during active job execution.
These changes aim to improve the reliability and clarity of cron job execution and management.
* feat: add session ID and key to CronRunLogEntry model
- Introduced `sessionid` and `sessionkey` properties to the `CronRunLogEntry` struct for enhanced tracking of session-related information.
- Updated the initializer and Codable conformance to accommodate the new properties, ensuring proper serialization and deserialization.
These changes aim to improve the granularity of logging and session management within the cron job system.
* fix: improve session display name resolution
- Updated the `resolveSessionDisplayName` function to ensure that both label and displayName are trimmed and default to an empty string if not present.
- Enhanced the logic to prevent returning the key if it matches the label or displayName, improving clarity in session naming.
These changes aim to enhance the accuracy and usability of session display names in the UI.
* perf: skip cron store persist when idle timer tick produces no changes
recomputeNextRuns now returns a boolean indicating whether any job
state was mutated. The idle path in onTimer only persists when the
return value is true, eliminating unnecessary file writes every 60s
for far-future or idle schedules.
* fix: prep for merge - explicit delivery mode migration, docs + changelog (#10776) (thanks @tyler6204)
(cherry picked from commit d90cac990c8f9864d2bcb0f3605a057fad2003cf)
# Conflicts:
# CHANGELOG.md
# docs/automation/cron-jobs.md
# scripts/test-parallel.mjs
# src/agents/openclaw-tools.subagents.sessions-spawn-applies-thinking-default.test.ts
# src/cli/cron-cli/register.cron-add.ts
# src/cron/delivery.ts
# src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts
# src/cron/isolated-agent/run.ts
# src/cron/normalize.ts
# src/cron/run-log.ts
# src/cron/service.every-jobs-fire.test.ts
# src/cron/service.skips-main-jobs-empty-systemevent-text.test.ts
# src/cron/service.store.migration.test.ts
# src/cron/service/jobs.ts
# src/cron/service/store.ts
# src/cron/service/timer.ts
# src/cron/store.ts
# src/gateway/protocol/schema/cron.ts
# src/gateway/session-utils.ts
# ui/src/ui/app-defaults.ts
# ui/src/ui/app-render.helpers.ts
# ui/src/ui/app-render.ts
# ui/src/ui/format.test.ts
# ui/src/ui/format.ts
# ui/src/ui/views/cron.ts
# ui/src/ui/views/sessions.ts
* fix: comprehensive BlueBubbles and channel cleanup (#11093)
* feat(bluebubbles): auto-strip markdown from outbound messages (#7402)
* fix(security): add timeout to webhook body reading (#6762)
Adds 30-second timeout to readBody() in voice-call, bluebubbles, and nostr
webhook handlers. Prevents Slow-Loris DoS (CWE-400, CVSS 7.5).
Merged with existing maxBytes protection in voice-call.
* fix(security): unify Error objects and lint fixes in webhook timeouts (#6762)
* fix: prevent plugins from auto-enabling without user consent (#3961)
Changes default plugin enabled state from true to false in enablePluginEntry().
Preserves existing enabled:true values. Fixes #3932.
* fix: apply hierarchical mediaMaxMb config to all channels (#8749)
Generalizes resolveAttachmentMaxBytes() to use account → channel → global
config resolution for all channels, not just BlueBubbles. Fixes #7847.
* fix(bluebubbles): sanitize attachment filenames against header injection (#10333)
Strip ", \r, \n, and \\ from filenames after path.basename() to prevent
multipart Content-Disposition header injection (CWE-93, CVSS 5.4).
Also adds sanitization to setGroupIconBlueBubbles which had zero filename
sanitization.
* fix(lint): exclude extensions/ from Oxlint preflight check (#9313)
Extensions use PluginRuntime|null patterns that trigger
no-redundant-type-constituents because PluginRuntime resolves to any.
Excluding extensions/ from Oxlint unblocks user upgrades.
Re-applies the approach from closed PR #10087.
* fix(bluebubbles): add tempGuid to createNewChatWithMessage payload (#7745)
Non-Private-API mode (AppleScript) requires tempGuid in send payloads.
The main sendMessageBlueBubbles already had it, but createNewChatWithMessage
was missing it, causing 400 errors for new chat creation without Private API.
* fix: send stop-typing signal when run ends with NO_REPLY (#8785)
Adds onCleanup callback to the typing controller that fires when the
controller is cleaned up while typing was active (e.g., after NO_REPLY).
Channels using createTypingCallbacks automatically get stop-typing on
cleanup. This prevents the typing indicator from lingering in group chats
when the agent decides not to reply.
* fix(telegram): deduplicate skill commands in multi-agent setup (#5717)
Two fixes:
1. Skip duplicate workspace dirs when listing skill commands across agents.
Multiple agents sharing the same workspace would produce duplicate commands
with _2, _3 suffixes.
2. Clear stale commands via deleteMyCommands before registering new ones.
Commands from deleted skills now get cleaned up on restart.
* fix: add size limits to unbounded in-memory caches (#4948)
Adds max-size caps with oldest-entry eviction to prevent OOM in
long-running deployments:
- BlueBubbles serverInfoCache: 64 entries (already has TTL)
- Google Chat authCache: 32 entries
- Matrix directRoomCache: 1024 entries
- Discord presenceCache: 5000 entries per account
* fix: address review concerns (#11093)
- Chain deleteMyCommands → setMyCommands to prevent race condition (#5717)
- Rename enablePluginEntry to registerPluginEntry (now sets enabled: false)
- Add Slow-Loris timeout test for readJsonBody (#6023)
(cherry picked from commit 1007d71f0cece18ca74d2a2bc7ab3b88c734f75e)
# Conflicts:
# extensions/bluebubbles/src/chat.ts
# extensions/bluebubbles/src/send.ts
# extensions/voice-call/src/webhook.ts
# src/auto-reply/skill-commands.ts
# src/config/plugin-auto-enable.ts
* fix: add .caf to AUDIO_FILE_EXTENSIONS (#10982)
* fix: add .caf to AUDIO_FILE_EXTENSIONS for iMessage voice messages
* fix: add caf audio extension regression coverage (#10982) (thanks @succ985)
---------
Co-authored-by: succ985 <succ985@users.noreply.github.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit b8f740fb148cce8e56191114c583859b6393bf61)
# Conflicts:
# CHANGELOG.md
# src/media/mime.test.ts
* fix: recover from context overflow caused by oversized tool results (#11579)
* fix: gracefully handle oversized tool results causing context overflow
When a subagent reads a very large file or gets a huge tool result (e.g.,
gh pr diff on a massive PR), it can exceed the model's context window in
a single prompt. Auto-compaction can't help because there's no older
history to compact — just one giant tool result.
This adds two layers of defense:
1. Pre-emptive: Hard cap on tool result size (400K chars ≈ 100K tokens)
applied in the session tool result guard before persistence. This
prevents extremely large tool results from being stored in full,
regardless of model context window size.
2. Recovery: When context overflow is detected and compaction fails,
scan session messages for oversized tool results relative to the
model's actual context window (30% max share). If found, truncate
them in the session via branching (creating a new branch with
truncated content) and retry the prompt.
The truncation preserves the beginning of the content (most useful for
understanding what was read) and appends a notice explaining the
truncation and suggesting offset/limit parameters for targeted reads.
Includes comprehensive tests for:
- Text truncation with newline-boundary awareness
- Context-window-proportional size calculation
- In-memory message truncation
- Oversized detection heuristics
- Guard-level size capping during persistence
* fix: prep fixes for tool result truncation PR (#11579) (thanks @tyler6204)
(cherry picked from commit 0deb8b0da187ed3a5ca1b0dc37736548795fbe31)
# Conflicts:
# src/agents/pi-embedded-runner/run.ts
# src/agents/session-tool-result-guard.test.ts
# src/agents/session-tool-result-guard.ts
* Memory: add SQLITE_BUSY fallback regression test
(cherry picked from commit 95263f4e60e734709cfd53ac45aa84d1a81fc108)
# Conflicts:
# src/memory/search-manager.test.ts
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas (#4824)
* fix: use STATE_DIR instead of hardcoded ~/.openclaw for identity and canvas
device-identity.ts and canvas-host/server.ts used hardcoded
path.join(os.homedir(), '.openclaw', ...) ignoring OPENCLAW_STATE_DIR
env var and the resolveStateDir() logic from config/paths.ts.
This caused ~/.openclaw/identity and ~/.openclaw/canvas directories
to be created even when state dir was overridden or resided elsewhere.
* fix: format and remove duplicate imports
* fix: scope state-dir patch + add regression tests (#4824) (thanks @kossoy)
* fix: align state-dir fallbacks in hooks and agent paths (#4824) (thanks @kossoy)
---------
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
(cherry picked from commit ebe57304016aaadf69c0357d49ec1e36df6a5daa)
# Conflicts:
# CHANGELOG.md
# src/agents/agent-scope.ts
# src/agents/sandbox/constants.ts
# src/canvas-host/server.ts
# src/cli/update-cli.ts
# src/commands/agents.test.ts
# src/hooks/bundled/command-logger/handler.ts
# src/hooks/bundled/session-memory/handler.ts
# src/infra/device-identity.ts
* fix: context overflow compaction and subagent announce improvements (#11664) (thanks @tyler6204)
* initial commit
* feat: implement deriveSessionTotalTokens function and update usage tests
* Added deriveSessionTotalTokens function to calculate total tokens based on usage and context tokens.
* Updated usage tests to include cases for derived session total tokens.
* Refactored session usage calculations in multiple files to utilize the new function for improved accuracy.
* fix: restore overflow truncation fallback + changelog/test hardening (#11551) (thanks @tyler6204)
(cherry picked from commit 191da1feb52e2cb164c6d1212c0dd133ae3f9198)
# Conflicts:
# CHANGELOG.md
# scripts/test-parallel.mjs
# src/agents/clawdbot-tools.subagents.sessions-spawn-normalizes-allowlisted-agent-ids.test.ts
# src/agents/pi-embedded-runner/run.overflow-compaction.test.ts
# src/agents/pi-embedded-runner/run.ts
# src/agents/pi-embedded-runner/run/types.ts
# src/agents/pi-embedded-subscribe.handlers.messages.ts
# src/agents/subagent-announce.format.test.ts
# src/agents/subagent-announce.ts
# src/agents/subagent-registry.ts
# src/agents/timeout.ts
# src/agents/usage.test.ts
# src/commands/agent/session-store.ts
# ui/src/styles/components.css
# ui/src/ui/views/chat.ts
---------
Co-authored-by: Clawdbot <lukavyi@me.com>
Co-authored-by: Ayaan Zaidi <zaidi@uplause.io>
Co-authored-by: Conroy Whitney <konreu@gmail.com>
Co-authored-by: Ayaan Zaidi <hi@obviy.us>
Co-authored-by: Shakker <shakkerdroid@gmail.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: Ayush Ojha <ayushgreat10@gmail.com>
Co-authored-by: Ayush Ojha <ayushozha@outlook.com>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@gmail.com>
Co-authored-by: Tyler Yust <64381258+tyler6204@users.noreply.github.com>
Co-authored-by: cpojer <christoph.pojer@gmail.com>
Co-authored-by: Jhin <jhin@summonai.org>
Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
Co-authored-by: Mario Zechner <badlogicgames@gmail.com>
Co-authored-by: clawdinator[bot] <253378751+clawdinator[bot]@users.noreply.github.com>
Co-authored-by: Evan <evan@iamevan.dev>
Co-authored-by: Sk Akram <skcodewizard786@gmail.com>
Co-authored-by: Marco Marandiz <admin-marco@Mac.lan>
Co-authored-by: Elarwei <elarweis@gmail.com>
Co-authored-by: Ji <jizhang.work@gmail.com>
Co-authored-by: Benjamin Jesuiter <bjesuiter@gmail.com>
Co-authored-by: Vignesh Natarajan <vigneshnatarajan92@gmail.com>
Co-authored-by: Glucksberg <markuscontasul@gmail.com>
Co-authored-by: Yudong Han <hanyd@pku.edu.cn>
Co-authored-by: Gustavo Madeira Santana <gumadeiras@users.noreply.github.com>
Co-authored-by: hyf0-agent <ada.20260202@outlook.com>
Co-authored-by: hyf0-agent <hyf0-agent@users.noreply.github.com>
Co-authored-by: Christian Klotz <hello@christianklotz.co.uk>
Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com>
Co-authored-by: Daijiro Miyazawa <dxd5001@gmail.com>
Co-authored-by: Darshil <ddhameliya@mail.sfsu.edu>
Co-authored-by: Sash Zats <sash@zats.io>
Co-authored-by: zerone0x <hi@trine.dev>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: adam91holt <mail@adamholt.co.nz>
Co-authored-by: Coy Geek <65363919+coygeek@users.noreply.github.com>
Co-authored-by: Yida-Dev <92713555+Yida-Dev@users.noreply.github.com>
Co-authored-by: Shadril Hassan Shifat <63901551+shadril238@users.noreply.github.com>
Co-authored-by: succ985 <3186520056@qq.com>
Co-authored-by: Oleg Kossoy <oleg.kossoy@gmail.com>
Co-authored-by: hughdidit <hugh.chapman@hughdidit.com>
hughdidit
pushed a commit
to hughdidit/DAISy-Agency
that referenced
this pull request
Mar 3, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com> (cherry picked from commit 22927b0) # Conflicts: # CHANGELOG.md # src/commands/onboard-non-interactive.cloudflare-ai-gateway.test.ts # src/commands/onboard-non-interactive/local.ts
zooqueen
pushed a commit
to hanzoai/bot
that referenced
this pull request
Mar 6, 2026
…boarding (openclaw#9241) * fix: infer --auth-choice from API key flags during non-interactive onboarding When --anthropic-api-key (or other provider key flags) is passed without an explicit --auth-choice, the auth choice defaults to "skip", silently discarding the API key. This means the gateway starts without credentials and fails on every inbound message with "No API key found for provider". Add inferAuthChoiceFromFlags() to derive the correct auth choice from whichever provider API key flag was supplied, so credentials are persisted to auth-profiles.json as expected. Fixes openclaw#8481 * fix: infer auth choice from API key flags (openclaw#8484) (thanks @f-trycua) * refactor: centralize auth choice inference flags (openclaw#8484) (thanks @f-trycua) --------- Co-authored-by: f-trycua <f@trycua.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
--auth-choicefrom provider API key flags in non-interactive onboarding so credentials are not dropped.Credits
This PR supersedes #8484 by @f-trycua. Thank you for the original report and fix.
Test plan
Fixes #8481
Greptile Overview
Greptile Summary
This PR fixes non-interactive onboarding dropping credentials by inferring
--auth-choicefrom explicit provider API key flags. It centralizes the flag→auth-choice mapping insrc/commands/onboard-non-interactive/local/auth-choice-inference.ts, adds a hard guard when multiple provider API key flags are passed without an explicit--auth-choice, and adds a targeted Cloudflare AI Gateway non-interactive test to ensure the inferred choice writes the expected auth profile/config.The change fits into the onboarding pipeline by selecting
authChoiceearlier inrunNonInteractiveOnboardingLocalbefore callingapplyNonInteractiveAuthChoice, so provider-specific auth profile configuration is applied consistently even when the user only supplies provider API key flags.Confidence Score: 5/5
applyNonInteractiveAuthChoicebranches (including Cloudflare AI Gateway). Added test coverage targets the new behavior. No definite functional regressions were identified in the diff review.