Skip to content
This repository was archived by the owner on Feb 27, 2026. It is now read-only.

Get up to date with OpenClaw main#22

Draft
neekolas wants to merge 2134 commits into
stagingfrom
02-15-update_to_upstream_staging
Draft

Get up to date with OpenClaw main#22
neekolas wants to merge 2134 commits into
stagingfrom
02-15-update_to_upstream_staging

Conversation

@neekolas
Copy link
Copy Markdown

@neekolas neekolas commented Feb 16, 2026

tl;dr

  • Gets up to date with the main branch of the upstream. Tries to fix typescript and configuration issues as best as I can figure out.

steipete and others added 30 commits February 15, 2026 16:42
Merged with gates skipped by maintainer request.

Prepared head SHA: 663ac49
steipete and others added 19 commits February 16, 2026 00:37
* Gateway/Control UI: preserve partial output on abort

* fix: finalize abort partial handling and tests (openclaw#15026) (thanks @advaitpaliwal)

---------

Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM>
…tream_staging

# Conflicts:
#	pnpm-lock.yaml
#	src/config/types.channels.ts
#	ui/src/ui/app-render.ts
Fix type errors: string error codes, approveHint on DmPolicy,
MarkdownTableMode values, positional resolveTextChunkLimit args,
remove env from ChannelAccountSnapshot, cast config objects with
identityId past OpenClawConfig's ConvosConfig type.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

⚠️ Formal models conformance drift detected

The formal models extracted constants (generated/*) do not match this openclaw PR.

This check is informational (not blocking merges yet).
See the formal-models-conformance-drift artifact for the diff.

If this change is intentional, follow up by updating the formal models repo or regenerating the extracted artifacts there.

@neekolas neekolas changed the title Add baidu qianfan model provider Get up to date with OpenClaw main Feb 16, 2026
@macroscopeapp
Copy link
Copy Markdown

macroscopeapp Bot commented Feb 16, 2026

Update to OpenClaw main by switching UI timestamps to formatRelativeTimestamp, adding IRC channel support, tightening gateway auth/webhook limits, and bumping default/alias models to claude-opus-4-6

Refactors time formatting across UI and CLI to relative format, introduces IRC channel metadata and plugin, enforces gateway/webhook auth and body size/timeouts, expands outbound/monitoring features (e.g., WhatsApp markdown, Telegram webhook secret, Discord components, Matrix account scoping), adds session/cron/tooling APIs and hooks, and updates model defaults/aliases and limits (including OpenAI Codex 5.3 and Venice streaming compat).

📍Where to Start

Start with gateway auth/runtime changes in resolveGatewayRuntimeConfig and related handlers in src/gateway/server-runtime-config.ts, then review webhook/auth limits in src/telegram/webhook.ts and src/browser/server-middleware.ts.


📊 Macroscope summarized 10af839. 138 files reviewed, 141 issues evaluated, 77 issues filtered, 15 comments posted. View details

private fun applyMainSessionKey(candidate: String?) {
val trimmed = candidate?.trim().orEmpty()
if (trimmed.isEmpty()) return
val trimmed = normalizeMainKey(candidate) ?: return
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

android/NodeRuntime.kt:295 In applyMainSessionKey, normalizeMainKey returns a non‑null String, so ?: return is dead code and empty input now becomes "main" instead of skipping an update. Suggest restoring the early‑return for blank candidates (e.g., check candidate.isNullOrBlank() before calling) or making normalizeMainKey return null for blank input.

Suggested change
val trimmed = normalizeMainKey(candidate) ?: return
if (candidate.isNullOrBlank()) return
val trimmed = normalizeMainKey(candidate)

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/android/app/src/main/java/ai/openclaw/android/NodeRuntime.kt around line 295:

In `applyMainSessionKey`, `normalizeMainKey` returns a non‑null `String`, so `?: return` is dead code and empty input now becomes `"main"` instead of skipping an update. Suggest restoring the early‑return for blank candidates (e.g., check `candidate.isNullOrBlank()` before calling) or making `normalizeMainKey` return `null` for blank input.

])
}

if let fallback = store.defaultCalendarForNewEvents {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

Calendar/CalendarService.swift:120 Suggestion: Ensure calendars are writable. Check allowsContentModifications when resolving a calendar (including store.defaultCalendarForNewEvents); if read‑only, choose another calendar or return a clear error.

-        if let fallback = store.defaultCalendarForNewEvents {
+        if let fallback = store.defaultCalendarForNewEvents, fallback.allowsContentModifications {

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Calendar/CalendarService.swift around line 120:

Suggestion: Ensure calendars are writable. Check `allowsContentModifications` when resolving a calendar (including `store.defaultCalendarForNewEvents`); if read‑only, choose another calendar or return a clear error.

Comment on lines +30 to +35
switch {
case strings.EqualFold(tgtLang, "zh-CN"):
// Keep this prompt as stable as possible; it has lots of tuning baked into the wording.
return strings.TrimSpace(fmt.Sprintf(zhCNPromptTemplate, srcLabel, tgtLabel, glossaryBlock))
case strings.EqualFold(tgtLang, "ja-JP"):
return strings.TrimSpace(fmt.Sprintf(jaJPPromptTemplate, srcLabel, tgtLabel, glossaryBlock))
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

docs-i18n/prompt.go:30 prettyLanguageLabel trims whitespace before matching, but translationPrompt doesn't trim tgtLang before EqualFold checks. Consider using the already-trimmed tgtLabel for template selection to ensure consistency.

Suggested change
switch {
case strings.EqualFold(tgtLang, "zh-CN"):
// Keep this prompt as stable as possible; it has lots of tuning baked into the wording.
return strings.TrimSpace(fmt.Sprintf(zhCNPromptTemplate, srcLabel, tgtLabel, glossaryBlock))
case strings.EqualFold(tgtLang, "ja-JP"):
return strings.TrimSpace(fmt.Sprintf(jaJPPromptTemplate, srcLabel, tgtLabel, glossaryBlock))
switch {
case strings.EqualFold(tgtLabel, "zh-CN") || strings.EqualFold(tgtLabel, "Simplified Chinese"):
// Keep this prompt as stable as possible; it has lots of tuning baked into the wording.
return strings.TrimSpace(fmt.Sprintf(zhCNPromptTemplate, srcLabel, tgtLabel, glossaryBlock))
case strings.EqualFold(tgtLabel, "ja-JP") || strings.EqualFold(tgtLabel, "Japanese"):
return strings.TrimSpace(fmt.Sprintf(jaJPPromptTemplate, srcLabel, tgtLabel, glossaryBlock))

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file scripts/docs-i18n/prompt.go around lines 30-35:

`prettyLanguageLabel` trims whitespace before matching, but `translationPrompt` doesn't trim `tgtLang` before `EqualFold` checks. Consider using the already-trimmed `tgtLabel` for template selection to ensure consistency.

Comment on lines +220 to +223
if !trimmedToken.isEmpty {
GatewaySettingsStore.saveGatewayToken(trimmedToken, instanceId: instanceId)
}
GatewaySettingsStore.saveGatewayPassword(trimmedPassword, instanceId: instanceId)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

Onboarding/GatewayOnboardingView.swift:220 Password is saved unconditionally, even when empty, which could overwrite a previously stored password. Consider adding an !trimmedPassword.isEmpty check like the token handling above.

Suggested change
if !trimmedToken.isEmpty {
GatewaySettingsStore.saveGatewayToken(trimmedToken, instanceId: instanceId)
}
GatewaySettingsStore.saveGatewayPassword(trimmedPassword, instanceId: instanceId)
if !trimmedToken.isEmpty {
GatewaySettingsStore.saveGatewayToken(trimmedToken, instanceId: instanceId)
}
if !trimmedPassword.isEmpty {
GatewaySettingsStore.saveGatewayPassword(trimmedPassword, instanceId: instanceId)
}

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Onboarding/GatewayOnboardingView.swift around lines 220-223:

Password is saved unconditionally, even when empty, which could overwrite a previously stored password. Consider adding an `!trimmedPassword.isEmpty` check like the token handling above.

Comment on lines +204 to +207
if let port = self.manualPortValue(), !(1...65535).contains(port) {
self.connectStatusText = "Failed: invalid port"
return
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

Onboarding/GatewayOnboardingView.swift:204 Port handling allows empty or non‑numeric input to fall through as 0. Suggest requiring a present, numeric port and validating 1…65535; if non‑empty but unparsable or out of range, show an error and avoid using 0.

Suggested change
if let port = self.manualPortValue(), !(1...65535).contains(port) {
self.connectStatusText = "Failed: invalid port"
return
}
let port = self.manualPortValue() ?? 0
guard (1...65535).contains(port) else {
self.connectStatusText = "Failed: invalid port"
return
}

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Onboarding/GatewayOnboardingView.swift around lines 204-207:

Port handling allows empty or non‑numeric input to fall through as `0`. Suggest requiring a present, numeric port and validating 1…65535; if non‑empty but unparsable or out of range, show an error and avoid using `0`.


private var isGatewayConnected: Bool {
let status = self.appModel.gatewayStatusText.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
if status.contains("connected") { return true }
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

Settings/SettingsTab.swift:458 status.contains("connected") also matches "disconnected". Suggest matching the exact state (e.g., guard against "disconnected" or use a word/prefix check), or rely on a boolean connection flag instead of substring matching.

Suggested change
if status.contains("connected") { return true }
if status.contains("connected") && !status.contains("disconnected") { return true }

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Settings/SettingsTab.swift around line 458:

`status.contains("connected")` also matches "disconnected". Suggest matching the exact state (e.g., guard against "disconnected" or use a word/prefix check), or rely on a boolean connection flag instead of substring matching.

}

private func applyURL(_ url: URL) {
guard let host = url.host, !host.isEmpty else { return }
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

Onboarding/GatewayOnboardingView.swift:302 applyURL fails silently when url.host is missing, yet applySetupCode still sets "Setup code applied." Suggest returning a success flag (or error) from applyURL and only setting the success message on success; otherwise update setupStatusText to indicate an invalid URL.

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Onboarding/GatewayOnboardingView.swift around line 302:

`applyURL` fails silently when `url.host` is missing, yet `applySetupCode` still sets "Setup code applied." Suggest returning a success flag (or error) from `applyURL` and only setting the success message on success; otherwise update `setupStatusText` to indicate an invalid URL.

])
}
await self.gateway.sendEvent(event: "agent.request", payloadJSON: json)
await self.nodeGateway.sendEvent(event: "agent.request", payloadJSON: json)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟡 Medium

Model/NodeAppModel.swift:620 sendEvent silently returns when channel is nil, so this call may succeed without actually sending anything. Consider checking gateway connection state before calling, or having sendEvent throw when the channel is unavailable.

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Model/NodeAppModel.swift around line 620:

`sendEvent` silently returns when `channel` is `nil`, so this call may succeed without actually sending anything. Consider checking gateway connection state before calling, or having `sendEvent` throw when the channel is unavailable.

Comment on lines +150 to +153
fun setGatewayToken(value: String) {
prefs.edit { putString("gateway.manual.token", value) }
_gatewayToken.value = value
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

android/SecurePrefs.kt:150 Consider trimming the value in setGatewayToken for consistency with setDisplayName, setManualHost, etc. Currently _gatewayToken.value stores untrimmed input, but loadGatewayToken() trims it at line 161.

Suggested change
fun setGatewayToken(value: String) {
prefs.edit { putString("gateway.manual.token", value) }
_gatewayToken.value = value
}
fun setGatewayToken(value: String) {
val trimmed = value.trim()
prefs.edit { putString("gateway.manual.token", trimmed) }
_gatewayToken.value = trimmed
}

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/android/app/src/main/java/ai/openclaw/android/SecurePrefs.kt around lines 150-153:

Consider trimming the `value` in `setGatewayToken` for consistency with `setDisplayName`, `setManualHost`, etc. Currently `_gatewayToken.value` stores untrimmed input, but `loadGatewayToken()` trims it at line 161.

private func isBackgroundRestricted(_ command: String) -> Bool {
command.hasPrefix("canvas.") || command.hasPrefix("camera.") || command.hasPrefix("screen.")
command.hasPrefix("canvas.") || command.hasPrefix("camera.") || command.hasPrefix("screen.") ||
command.hasPrefix("talk.")
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🟢 Low

Model/NodeAppModel.swift:677 The error message in handleInvoke says "canvas/camera/screen commands require foreground" but now talk. is also restricted. Consider updating the error message to include "talk".

🚀 Want me to fix this? Reply ex: "fix it for me".

🤖 Prompt for AI
In file apps/ios/Sources/Model/NodeAppModel.swift around line 677:

The error message in `handleInvoke` says "canvas/camera/screen commands require foreground" but now `talk.` is also restricted. Consider updating the error message to include "talk".

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.