Skip to content

Commit efc3c8e

Browse files
authored
fix(queue): preserve queued turn ownership
1 parent e307d25 commit efc3c8e

927 files changed

Lines changed: 47579 additions & 58902 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.oxlintrc.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
"typescript/prefer-promise-reject-errors": "error",
8888
"typescript/restrict-plus-operands": "error",
8989
"typescript/no-unnecessary-qualifier": "error",
90-
"typescript/no-unnecessary-type-assertion": "error",
90+
"typescript/no-unnecessary-type-assertion": "off",
9191
"typescript/no-unnecessary-type-arguments": "error",
9292
"typescript/no-unnecessary-type-constraint": "error",
9393
"typescript/no-unnecessary-type-conversion": "error",

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Docs: https://docs.openclaw.ai
1818

1919
### Changes
2020

21+
- **Generated session titles:** name new Control UI sessions from their first message, and add default/per-agent `utilityModel` routing for lower-cost session, topic, and thread title generation. Thanks @Juliangsm and @zhangguiping-xydt.
2122
- **ClawRouter routing and quotas:** add the bundled ClawRouter provider plugin with credential-scoped dynamic model discovery, OpenAI-compatible and native Anthropic/Gemini transports, and managed budget reporting across OpenClaw usage surfaces. (#99658)
2223
- **Model and provider coverage:** add GPT-5.6 support, use Nemotron Super's 1M context window, and preserve explicit OpenRouter authentication headers. (#98333, #98726, #98187) Thanks @steipete-oai, @eleqtrizit, @sunlit-deng, and @laurencebrown.
2324
- **CLI and node workflows:** add `openclaw attach`, node context-path support, actionable device-approval recovery guidance, soft-resume CLI sessions when prompt metadata changes, and clearer plugin install exit diagnostics. (#96454, #97679, #98115, #98146, #98497, #99822) Thanks @anagnorisis2peripeteia, @obviyus, @wm0018, @welfo-beo, @RomneyDa, @Sanjays2402, and @vincentkoc.
@@ -31,7 +32,7 @@ Docs: https://docs.openclaw.ai
3132
### Fixes
3233

3334
- **ClawRouter auth profiles:** resolve credential-scoped catalog models during agent runs when the proxy key is stored in an auth profile, and document plugin and model allowlists.
34-
- **Telegram durability:** recover stalled ingress claims, retry restart-dropped media, survive transient polling errors, dead-letter poison updates, preserve forwarded rich text, route plugin callbacks correctly, keep progress updates in one stable multi-line window, and fall back safely when Telegram rejects rich final replies. (#97118, #98102, #98735, #98775, #98776, #97174, #98907, #98786) Thanks @vincentkoc, @luoyanglang, @DaveArcher18, @obviyus, @goldmar, @Marvinthebored, and @shakkernerd.
35+
- **Telegram durability:** recover stalled ingress claims, retry restart-dropped media, survive transient polling errors, dead-letter poison updates, preserve forwarded rich text, route plugin callbacks correctly, keep progress updates in one stable multi-line window, map self-hosted Bot API container paths through trusted host roots, and fall back safely when Telegram rejects rich final replies. (#97118, #98102, #98735, #98775, #98776, #97174, #98907, #91984, #98786) Thanks @vincentkoc, @luoyanglang, @DaveArcher18, @obviyus, @goldmar, @Marvinthebored, @Dizesales, and @shakkernerd.
3536
- **Agent and context reliability:** preserve runtime overrides, steered subagent tasks, fallback tool-call hints, and legacy reseed attachments; soft-resume CLI sessions across prompt-only drift; improve harness-aware context estimation and compaction prechecks; time out silent local streams; recover mid-stream failures; and cap Gateway run-cache growth. (#92237, #77539, #99851, #99839, #99822, #97928, #97861, #98525, #95430, #77973) Thanks @sercada, @amittell, @obviyus, @liuhao1024, @yetval, @osolmaz, @lzyyzznl, @vincentkoc, @alexelgier, and @fede-kamel.
3637
- **Provider and network safety:** bound oversized or malformed responses across Moonshot, MiniMax, Anthropic OAuth, Discord, Matrix, SMS, browser, update, embeddings, Tlön, and Inworld paths. (#96502, #96322, #96644, #97693, #97662, #97999, #98455, #98508, #98554, #98496, #98660) Thanks @hugenshen, @cursoragent, @lsr911, @solodmd, @Alix-007, @wings1029, @lzyyzznl, @sunlit-deng, @vincentkoc, and @Pandah97.
3738
- **Channel delivery and routing:** keep Slack replies in the active thread, preserve account-bound delivery routes, apply response prefixes, suppress internal traces and unwanted fallback replies, and retain WeChat session routing for opaque account ids. (#97168, #98240, #89949, #93639, #97989, #80928, #93686) Thanks @LiuwqGit, @gorkem2020, @yetval, @wangwllu, @ZengWen-DT, @alexuser, @UnClouded77, @zhangguiping-xydt, @htkillermax-gif, and @vincentkoc.
@@ -506,6 +507,7 @@ This audited record covers the complete 66e676d29b92d040716376a75aca32bad655cfac
506507
- **PR #99714** perf(usage): shrink durable usage cache entries. Related #99511. Thanks @dexhunter and @wayne524.
507508
- **PR #99838** feat: declutter the Control UI shell — reasoning effort slider, borderless composer controls, version out of the sidebar. Related #99837.
508509
- **PR #93686** fix(weixin): startAccount preserves session routing. Related #93556. Thanks @zhangguiping-xydt and @htkillermax-gif.
510+
509511
## 2026.6.11
510512

511513
We heard the feedback. v2026.6.11 focuses on the rough edges that make OpenClaw feel less dependable, with fixes for misplaced replies, stuck sends, reconnects, model setup failures, and safer admin defaults.

apps/shared/OpenClawKit/Sources/OpenClawKit/Resources/CanvasA2UI/a2ui.bundle.js

Lines changed: 51 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -656,11 +656,12 @@ var ZodType = class {
656656
data,
657657
parsedType: getParsedType(data)
658658
};
659-
return handleResult(ctx, this._parseSync({
659+
const result = this._parseSync({
660660
data,
661661
path: ctx.path,
662662
parent: ctx
663-
}));
663+
});
664+
return handleResult(ctx, result);
664665
}
665666
"~validate"(data) {
666667
const ctx = {
@@ -717,7 +718,8 @@ var ZodType = class {
717718
path: ctx.path,
718719
parent: ctx
719720
});
720-
return handleResult(ctx, await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult)));
721+
const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));
722+
return handleResult(ctx, result);
721723
}
722724
refine(check, message) {
723725
const getIssueProperties = (val) => {
@@ -3270,7 +3272,8 @@ var ZodPromise = class extends ZodType {
32703272
});
32713273
return INVALID;
32723274
}
3273-
return OK((ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data)).then((data) => {
3275+
const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);
3276+
return OK(promisified.then((data) => {
32743277
return this._def.type.parseAsync(data, {
32753278
path: ctx.path,
32763279
errorMap: ctx.common.contextualErrorMap
@@ -3744,35 +3747,23 @@ const DataValueMapItemSchema = lazyType(() => objectType({
37443747
message: `Value map item must have exactly one value property (valueString, valueNumber, valueBoolean, valueMap), found ${count}.`
37453748
});
37463749
}));
3747-
const DataValueSchema = objectType({
3748-
key: stringType(),
3749-
valueString: stringType().optional(),
3750-
valueNumber: numberType().optional(),
3751-
valueBoolean: booleanType().optional(),
3752-
valueMap: arrayType(DataValueMapItemSchema).optional()
3753-
}).strict().superRefine((val, ctx) => {
3754-
let count = 0;
3755-
if (val.valueString !== void 0) count++;
3756-
if (val.valueNumber !== void 0) count++;
3757-
if (val.valueBoolean !== void 0) count++;
3758-
if (val.valueMap !== void 0) count++;
3759-
if (count !== 1) ctx.addIssue({
3760-
code: ZodIssueCode.custom,
3761-
message: `Value must have exactly one value property (valueString, valueNumber, valueBoolean, valueMap), found ${count}.`
3750+
function createDataValueSchema(options = {}) {
3751+
const maxDepth = options.maxDepth ?? 5;
3752+
return DataValueMapItemSchema.superRefine((val, ctx) => {
3753+
const checkDepth = (v, currentDepth) => {
3754+
if (currentDepth > maxDepth) {
3755+
ctx.addIssue({
3756+
code: ZodIssueCode.custom,
3757+
message: `valueMap recursion exceeded maximum depth of ${maxDepth}.`
3758+
});
3759+
return;
3760+
}
3761+
if (v.valueMap && Array.isArray(v.valueMap)) for (const item of v.valueMap) checkDepth(item, currentDepth + 1);
3762+
};
3763+
checkDepth(val, 1);
37623764
});
3763-
}).superRefine((val, ctx) => {
3764-
const checkDepth = (v, currentDepth) => {
3765-
if (currentDepth > 5) {
3766-
ctx.addIssue({
3767-
code: ZodIssueCode.custom,
3768-
message: "valueMap recursion exceeded maximum depth of 5."
3769-
});
3770-
return;
3771-
}
3772-
if (v.valueMap && Array.isArray(v.valueMap)) for (const item of v.valueMap) checkDepth(item, currentDepth + 1);
3773-
};
3774-
checkDepth(val, 1);
3775-
});
3765+
}
3766+
const DataValueSchema = createDataValueSchema();
37763767
objectType({
37773768
path: stringType().optional(),
37783769
literalNumber: numberType().optional(),
@@ -5551,7 +5542,7 @@ var Signal;
55515542
* (though, see deep.ts for nested / deep behavior)
55525543
*/
55535544
const createStorage = (initial = null) => new Signal.State(initial, { equals: () => false });
5554-
const ARRAY_GETTER_METHODS = new Set([
5545+
const ARRAY_GETTER_METHODS = /* @__PURE__ */ new Set([
55555546
Symbol.iterator,
55565547
"concat",
55575548
"entries",
@@ -5574,7 +5565,7 @@ const ARRAY_GETTER_METHODS = new Set([
55745565
"some",
55755566
"values"
55765567
]);
5577-
const ARRAY_WRITE_THEN_READ_METHODS = new Set([
5568+
const ARRAY_WRITE_THEN_READ_METHODS = /* @__PURE__ */ new Set([
55785569
"fill",
55795570
"push",
55805571
"unshift"
@@ -6702,8 +6693,10 @@ var i$5 = class {
67026693
* SPDX-License-Identifier: BSD-3-Clause
67036694
*/ const { I: t$2 } = j$1, i$4 = (o) => o, n$6 = (o) => null === o || "object" != typeof o && "function" != typeof o, r$4 = (o) => void 0 === o.strings, s$5 = () => document.createComment(""), v = (o, n, e) => {
67046695
const l = o._$AA.parentNode, d = void 0 === n ? o._$AB : n._$AA;
6705-
if (void 0 === e) e = new t$2(l.insertBefore(s$5(), d), l.insertBefore(s$5(), d), o, o.options);
6706-
else {
6696+
if (void 0 === e) {
6697+
const i = l.insertBefore(s$5(), d), n = l.insertBefore(s$5(), d);
6698+
e = new t$2(i, n, o, o.options);
6699+
} else {
67076700
const t = e._$AB.nextSibling, n = e._$AM, c = n !== o;
67086701
if (c) {
67096702
let t;
@@ -7313,7 +7306,8 @@ let Root = (() => {
73137306
if (this.#lightDomEffectDisposer) this.#lightDomEffectDisposer();
73147307
this.#lightDomEffectDisposer = effect(() => {
73157308
const allChildren = this.childComponents ?? null;
7316-
D(this.renderComponentTree(allChildren), this, { host: this });
7309+
const lightDomTemplate = this.renderComponentTree(allChildren);
7310+
D(lightDomTemplate, this, { host: this });
73177311
});
73187312
}
73197313
}
@@ -9259,8 +9253,9 @@ var __runInitializers$10 = function(thisArg, initializers, value) {
92599253
return b`(empty)`;
92609254
}
92619255
render() {
9256+
const classes = merge(this.theme.components.Image.all, this.usageHint ? this.theme.components.Image[this.usageHint] : {});
92629257
return b`<section
9263-
class=${e$2(merge(this.theme.components.Image.all, this.usageHint ? this.theme.components.Image[this.usageHint] : {}))}
9258+
class=${e$2(classes)}
92649259
style=${o$2({
92659260
...this.theme.additionalStyles?.Image ?? {},
92669261
"--object-fit": this.fit ?? "fill"
@@ -9952,10 +9947,11 @@ var __runInitializers$8 = function(thisArg, initializers, value) {
99529947
</div>
99539948
`;
99549949
const count = currentSelections.length;
9950+
const headerText = count > 0 ? `${count} Selected` : this.description ?? "Select items";
99559951
return b`
99569952
<div class="container">
99579953
<div class="dropdown-header" @click=${() => this.isOpen = !this.isOpen}>
9958-
<span class="header-text">${count > 0 ? `${count} Selected` : this.description ?? "Select items"}</span>
9954+
<span class="header-text">${headerText}</span>
99599955
<span class="chevron ${this.isOpen ? "open" : ""}">
99609956
<svg
99619957
xmlns="http://www.w3.org/2000/svg"
@@ -9974,9 +9970,10 @@ var __runInitializers$8 = function(thisArg, initializers, value) {
99749970
<div class="options-scroll-container">
99759971
${filteredOptions.map((option) => {
99769972
const label = extractStringValue(option.label, this.component, this.processor, this.surfaceId);
9973+
const isSelected = currentSelections.includes(option.value);
99779974
return b`
99789975
<div
9979-
class="option-item ${currentSelections.includes(option.value) ? "selected" : ""}"
9976+
class="option-item ${isSelected ? "selected" : ""}"
99809977
@click=${(e) => {
99819978
e.stopPropagation();
99829979
this.toggleSelection(option.value);
@@ -11535,21 +11532,26 @@ const markdown$1 = e$6(class MarkdownDirective extends i$5 {
1153511532
* if present. Otherwise, it returns the value wrapped in a span.
1153611533
*/
1153711534
render(value, markdownRenderer, markdownOptions) {
11538-
if (markdownRenderer) return m(markdownRenderer(value, markdownOptions).then((value) => {
11539-
return o(value);
11540-
}), b`<span class="no-markdown-renderer">${value}</span>`);
11541-
return m((async () => {
11535+
if (markdownRenderer) {
11536+
const rendered = markdownRenderer(value, markdownOptions).then((value) => {
11537+
return o(value);
11538+
});
11539+
return m(rendered, b`<span class="no-markdown-renderer">${value}</span>`);
11540+
}
11541+
const dynamicRendererPromise = (async () => {
1154211542
try {
1154311543
const { renderMarkdown } = await import("@a2ui/markdown-it");
11544-
return o(await renderMarkdown(value, markdownOptions));
11545-
} catch (e) {
11544+
const rendered = await renderMarkdown(value, markdownOptions);
11545+
return o(rendered);
11546+
} catch {
1154611547
if (!MarkdownDirective.defaultMarkdownWarningLogged) {
1154711548
console.warn("[MarkdownDirective] Failed to load optional `@a2ui/markdown-it` renderer. Using fallback regex.");
1154811549
MarkdownDirective.defaultMarkdownWarningLogged = true;
1154911550
}
1155011551
return b`<span class="no-markdown-renderer">${value}</span>`;
1155111552
}
11552-
})(), b`<span class="no-markdown-renderer">${value}</span>`);
11553+
})();
11554+
return m(dynamicRendererPromise, b`<span class="no-markdown-renderer">${value}</span>`);
1155311555
}
1155411556
});
1155511557
/**
@@ -11778,8 +11780,9 @@ var __runInitializers$1 = function(thisArg, initializers, value) {
1177811780
return additionalStyles;
1177911781
}
1178011782
render() {
11783+
const classes = merge(this.theme.components.Text.all, this.usageHint ? this.theme.components.Text[this.usageHint] : {});
1178111784
return b`<section
11782-
class=${e$2(merge(this.theme.components.Text.all, this.usageHint ? this.theme.components.Text[this.usageHint] : {}))}
11785+
class=${e$2(classes)}
1178311786
style=${this.theme.additionalStyles?.Text ? o$2(this.#getAdditionalStyles()) : A}
1178411787
>
1178511788
${this.#renderText()}

0 commit comments

Comments
 (0)