Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,14 @@

What problem does this PR solve?


Why does this matter now?


What is the intended outcome?


What is intentionally out of scope?


What does success look like?


What should reviewers focus on?

<details>
Expand Down Expand Up @@ -75,13 +70,10 @@ Be mindful of private information like IP addresses, API keys, phone numbers, no

Which commands did you run?


What regression coverage was added or updated?


What failed before this fix, if known?


If no test was added, why not?

<details>
Expand All @@ -95,16 +87,12 @@ List focused commands, not every incidental check. CI is useful support, but ext

Did user-visible behavior change? (`Yes/No`)


Did config, environment, or migration behavior change? (`Yes/No`)


Did security, auth, secrets, network, or tool execution behavior change? (`Yes/No`)


What is the highest-risk area?


How is that risk mitigated?

<details>
Expand All @@ -118,10 +106,8 @@ Use this for author judgment that is not obvious from the diff. ClawSweeper can

What is the next action?


What is still waiting on author, maintainer, CI, or external proof?


Which bot or reviewer comments were addressed?

<details>
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1302,6 +1302,7 @@ jobs:
pnpm lint:auth:no-pairing-store-group
pnpm lint:auth:pairing-account-scope
pnpm check:import-cycles
pnpm format:check
# build-artifacts already runs the tsdown/runtime build for the same Node-relevant changes.
NODE_OPTIONS=--max-old-space-size=8192 pnpm build:plugin-sdk:strict-smoke
;;
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/docs-agent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,7 @@ jobs:

- name: Restore Node 24 path
if: steps.gate.outputs.run_agent == 'true'
run:
| # zizmor: ignore[github-env] NODE_BIN is set by the trusted local setup-node-env action in this same job
run: | # zizmor: ignore[github-env] NODE_BIN is set by the trusted local setup-node-env action in this same job
set -euo pipefail
export PATH="${NODE_BIN}:${PATH}"
echo "${NODE_BIN}" >> "$GITHUB_PATH"
Expand Down
11 changes: 10 additions & 1 deletion .github/workflows/full-release-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1139,7 +1139,16 @@ jobs:

summary:
name: Verify full validation
needs: [resolve_target, docker_runtime_assets_preflight, normal_ci, plugin_prerelease, release_checks, npm_telegram, performance]
needs:
[
resolve_target,
docker_runtime_assets_preflight,
normal_ci,
plugin_prerelease,
release_checks,
npm_telegram,
performance,
]
if: always()
runs-on: ubuntu-24.04
timeout-minutes: 5
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/test-performance-agent.yml
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,7 @@ jobs:

- name: Restore Node 24 path
if: steps.gate.outputs.run_agent == 'true' && steps.patch.outputs.has_changes == 'true'
run:
| # zizmor: ignore[github-env] NODE_BIN is set by the trusted local setup-node-env action in this same job
run: | # zizmor: ignore[github-env] NODE_BIN is set by the trusted local setup-node-env action in this same job
set -euo pipefail
export PATH="${NODE_BIN}:${PATH}"
echo "${NODE_BIN}" >> "$GITHUB_PATH"
Expand Down
2 changes: 1 addition & 1 deletion docs/channels/feishu.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Requires OpenClaw 2026.5.29 or above. Run `openclaw --version` to check. Upgrade
```
Choose manual setup to paste an App ID and App Secret from Feishu Open Platform, or choose QR setup to create a bot automatically. If the domestic Feishu mobile app does not react to the QR code, rerun setup and choose manual setup.
</Step>

<Step title="After setup completes, restart the gateway to apply the changes">
```bash
openclaw gateway restart
Expand Down
4 changes: 1 addition & 3 deletions docs/channels/line.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,9 +181,7 @@ messages.
},
flexMessage: {
altText: "Status card",
contents: {
/* Flex payload */
},
contents: {/* Flex payload */},
},
templateMessage: {
type: "confirm",
Expand Down
8 changes: 1 addition & 7 deletions docs/concepts/message-lifecycle-refactor.md
Original file line number Diff line number Diff line change
Expand Up @@ -787,13 +787,7 @@ type DurableSendIntent = {
batch?: RenderedMessageBatch;
liveState?: LiveMessageState;
status:
| "pending"
| "sending"
| "committing"
| "unknown_after_send"
| "sent"
| "failed"
| "cancelled";
"pending" | "sending" | "committing" | "unknown_after_send" | "sent" | "failed" | "cancelled";
attempt: number;
nextAttemptAt?: number;
receipt?: MessageReceipt;
Expand Down
12 changes: 3 additions & 9 deletions docs/nodes/media-understanding.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,20 +69,14 @@ If understanding fails or is disabled, **the reply flow continues** with the ori
{
tools: {
media: {
models: [
/* shared list */
],
image: {
/* optional overrides */
},
models: [/* shared list */],
image: {/* optional overrides */},
audio: {
/* optional overrides */
echoTranscript: true,
echoFormat: '📝 "{transcript}"',
},
video: {
/* optional overrides */
},
video: {/* optional overrides */},
},
},
}
Expand Down
3 changes: 1 addition & 2 deletions docs/plugins/message-presentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ type MessagePresentationBlock =
| { type: "select"; placeholder?: string; options: MessagePresentationOption[] };

type MessagePresentationAction =
| { type: "command"; command: string }
| { type: "callback"; value: string };
{ type: "command"; command: string } | { type: "callback"; value: string };

type MessagePresentationButton = {
label: string;
Expand Down
8 changes: 2 additions & 6 deletions docs/plugins/sdk-entrypoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,8 @@ export default definePluginEntry({
name: "My Plugin",
description: "Short summary",
register(api) {
api.registerProvider({
/* ... */
});
api.registerTool({
/* ... */
});
api.registerProvider({/* ... */});
api.registerTool({/* ... */});
},
});
```
Expand Down
46 changes: 22 additions & 24 deletions extensions/acpx/src/runtime.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -442,27 +442,25 @@ describe("AcpxRuntime fresh reset wrapper", () => {
list: () => ["codex"],
},
});
vi.spyOn(delegate, "startTurn").mockImplementation(
(input): AcpRuntimeTurn => ({
requestId: input.requestId,
events: (async function* () {
yield {
type: "text_delta" as const,
stream: "output" as const,
text: "Vou mapear o fluxo real primeiro...",
};
})(),
result: Promise.resolve({
status: "failed" as const,
error: {
message: "Internal error",
retryable: false,
},
}),
cancel: vi.fn(async () => {}),
closeStream: vi.fn(async () => {}),
vi.spyOn(delegate, "startTurn").mockImplementation((input): AcpRuntimeTurn => ({
requestId: input.requestId,
events: (async function* () {
yield {
type: "text_delta" as const,
stream: "output" as const,
text: "Vou mapear o fluxo real primeiro...",
};
})(),
result: Promise.resolve({
status: "failed" as const,
error: {
message: "Internal error",
retryable: false,
},
}),
);
cancel: vi.fn(async () => {}),
closeStream: vi.fn(async () => {}),
}));

const turn = runtime.startTurn({
handle: {
Expand Down Expand Up @@ -561,8 +559,9 @@ describe("AcpxRuntime fresh reset wrapper", () => {
const runTurn = vi.spyOn(delegate, "runTurn").mockImplementation(async function* () {
yield { type: "done" };
});
const startTurn = vi.spyOn(delegate, "startTurn").mockImplementation(
(input): AcpRuntimeTurn => ({
const startTurn = vi
.spyOn(delegate, "startTurn")
.mockImplementation((input): AcpRuntimeTurn => ({
requestId: input.requestId,
events: (async function* () {
yield { type: "done" as const, stopReason: "end_turn" };
Expand All @@ -573,8 +572,7 @@ describe("AcpxRuntime fresh reset wrapper", () => {
}),
cancel: vi.fn(async () => {}),
closeStream: vi.fn(async () => {}),
}),
);
}));

for await (const ignoredEventValue of runtime.runTurn({
handle: {
Expand Down
26 changes: 11 additions & 15 deletions extensions/browser/src/browser-tool.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,13 @@ const browserClientMocks = vi.hoisted(() => ({
browserProfiles: vi.fn(
async (..._args: unknown[]): Promise<Array<Record<string, unknown>>> => [],
),
browserSnapshot: vi.fn(
async (..._args: unknown[]): Promise<Record<string, unknown>> => ({
ok: true,
format: "ai",
targetId: "t1",
url: "https://example.com",
snapshot: "ok",
}),
),
browserSnapshot: vi.fn(async (..._args: unknown[]): Promise<Record<string, unknown>> => ({
ok: true,
format: "ai",
targetId: "t1",
url: "https://example.com",
snapshot: "ok",
})),
browserStart: vi.fn(async (..._args: unknown[]) => ({})),
browserStatus: vi.fn(async (..._args: unknown[]) => ({
ok: true,
Expand Down Expand Up @@ -111,12 +109,10 @@ const nodesUtilsMocks = vi.hoisted(() => ({
}));

const gatewayMocks = vi.hoisted(() => ({
callGatewayTool: vi.fn(
async (): Promise<Record<string, unknown>> => ({
ok: true,
payload: { result: { ok: true, running: true } },
}),
),
callGatewayTool: vi.fn(async (): Promise<Record<string, unknown>> => ({
ok: true,
payload: { result: { ok: true, running: true } },
})),
}));

const configMocks = vi.hoisted(() => ({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ vi.mock("./chrome.js", () => ({
message: "mock CDP diagnostic",
elapsedMs: 1,
})),
formatChromeCdpDiagnostic: vi.fn((diagnostic: { ok: boolean; code?: string; message?: string }) =>
diagnostic.ok
? "CDP diagnostic: ready."
: `CDP diagnostic: ${diagnostic.code}; ${diagnostic.message}.`,
formatChromeCdpDiagnostic: vi.fn(
(diagnostic: { ok: boolean; code?: string; message?: string }) =>
diagnostic.ok
? "CDP diagnostic: ready."
: `CDP diagnostic: ${diagnostic.code}; ${diagnostic.message}.`,
),
isChromeCdpReady: vi.fn(async () => true),
isChromeReachable: vi.fn(async () => true),
Expand Down
5 changes: 1 addition & 4 deletions extensions/canvas/scripts/copy-a2ui.d.mts
Original file line number Diff line number Diff line change
@@ -1,4 +1 @@
export declare function copyA2uiAssets(params: {
srcDir: string;
outDir: string;
}): Promise<void>;
export declare function copyA2uiAssets(params: { srcDir: string; outDir: string }): Promise<void>;
26 changes: 15 additions & 11 deletions extensions/canvas/src/host/a2ui-app/bootstrap.js
Original file line number Diff line number Diff line change
Expand Up @@ -566,17 +566,21 @@ class OpenClawA2UIHost extends LitElement {
? `Failed: ${this.pendingAction.name}`
: "";

return html` ${this.pendingAction && this.pendingAction.phase !== "error"
? html`<div class="status">
<div class="spinner"></div>
<div>${statusText}</div>
</div>`
: ""}
${this.toast
? html`<div class="toast ${this.toast.kind === "error" ? "error" : ""}">
${this.toast.text}
</div>`
: ""}
return html` ${
this.pendingAction && this.pendingAction.phase !== "error"
? html`<div class="status">
<div class="spinner"></div>
<div>${statusText}</div>
</div>`
: ""
}
${
this.toast
? html`<div class="toast ${this.toast.kind === "error" ? "error" : ""}">
${this.toast.text}
</div>`
: ""
}
<section id="surfaces">
${repeat(
this.surfaces,
Expand Down
Loading
Loading