Skip to content

fix: deliver ClickClack media and use runtime model budgets [AI-assisted]#105775

Merged
shakkernerd merged 10 commits into
openclaw:mainfrom
jjjhenriksen:codex/clickclack-send-media
Jul 13, 2026
Merged

fix: deliver ClickClack media and use runtime model budgets [AI-assisted]#105775
shakkernerd merged 10 commits into
openclaw:mainfrom
jjjhenriksen:codex/clickclack-send-media

Conversation

@jjjhenriksen

@jjjhenriksen jjjhenriksen commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

This PR is AI-assisted. I have personally verified all code and AI was used for syntax.

Summary

Fix two ClickClack outbound failure modes:

  1. Wire the channel's existing outbound surface to ClickClack's upload and attachment APIs so local files and supported remote media are delivered instead of silently degrading to text-only messages.
  2. Remove the hard-coded model-reply limit so ClickClack defers to the selected runtime and model output budget.

The patch also makes durable media retries idempotent and logs model-mode completions that produce no sendable text.

What Problem This Solves

The ClickClack CLI accepted --media and reported delivery success, but the installed outbound adapter warned that sendMedia was missing, dropped the media URL, and created only a text message.

Separately, replyMode: "model" always called llm.complete with maxTokens: 96. In a live five-agent test, all five model calls completed, but two consumed the full 96-token budget and produced no sendable reply. Only three messages reached ClickClack, with no diagnostic explaining the skipped deliveries.

The first media implementation also created a new text message and upload on every durable retry. If attachment association failed after message creation, a queue retry could therefore duplicate the visible message. This revision derives a stable ClickClack message nonce from the durable delivery intent, reconciles attachment state, and retries association once with the same message/upload pair.

Change Type (select all)

  • Bug fix
  • Feature
  • Refactor required for the fix
  • Docs
  • Security hardening
  • Chore/infra

Scope (select all touched areas)

  • Gateway / orchestration
  • Skills / tool execution
  • Auth / tokens
  • Memory / storage
  • API / contracts
  • UI / DX
  • CI/CD / infra

Linked Issue/PR

  • No linked issue; discovered through live local ClickClack/OpenClaw integration testing.
  • This PR fixes a bug or regression

Evidence

  • Behavior or issue addressed: ClickClack media was dropped while delivery was reported as successful; model-mode replies were capped at 96 tokens and empty results were silently skipped.
  • Real environment tested: local OpenClaw checkout on macOS arm64, Node v24.14.1, local ClickClack server at 127.0.0.1:18082, five named ClickClack bot accounts.
  • Before media evidence:
openclaw message send --channel clickclack --account blackbird \
  --target channel:<general-channel-id> \
  --message "File delivery E2E test from OpenClaw." \
  --media /tmp/clickclack-openclaw-file-e2e.txt --json

[outbound/deliver] Plugin outbound adapter does not implement sendMedia;
media URLs will be dropped and text fallback will be used
  • Before model-reply evidence: one Hello event reached all five bot connections and all five runtime.llm calls completed. ClickClack persisted replies from Mustang, Clipper, and Nighthawk only. Blackbird and Dragon Lady both reached the hard-coded 96-token ceiling and emitted no outbound message request.
  • Exact live media verification after this patch:
node --import tsx --input-type=module -e '<invoke sendClickClackMedia with the Blackbird account and local file>'
{"messageId":"msg_01kxcc9khfgxs2y9d4b0ryrdf4"}
POST /api/uploads                         201
POST /api/channels/{channel_id}/messages 201
POST /api/messages/{message_id}/attachments 200
GET  /api/uploads/{upload_id}             200 (51 bytes)

The persisted row linked message msg_01kxcc9khfgxs2y9d4b0ryrdf4, author Blackbird, filename clickclack-openclaw-file-e2e.txt, content type text/plain, and byte size 51.

Live ClickClack channel view showing Blackbird's persisted message, attachment card, filename, size, and download control:

Live ClickClack media delivery

Live ClickClack artifact viewer showing the same 51-byte attachment opened successfully with its exact contents:

Live ClickClack media preview

  • Retry-safety regression proof:
first attach attempt -> simulated lost response
GET /api/messages/{message_id} -> reconcile persisted attachments
bounded retry -> same message id + same upload id
durable queue retry -> same nonce-keyed message; no duplicate upload when attached

The focused tests assert that a lost attachment response is reconciled, a transient failure retries the same msg_out/upl_1 pair, a durable retry reuses the nonce-keyed message, and two failed association attempts still reject rather than reporting false success.

  • Final runtime-default model-mode verification used the patched plugin with no ClickClack-specific token cap. ClickClack persisted one reply from every account, and the runtime reported no empty-response warnings:
Blackbird    636 output tokens   msg_01kxcm57jqckqtqpwtjwq5cj90
Clipper      667 output tokens   msg_01kxcm57m9910swmt4t0bz8z35
Dragon Lady  1116 output tokens  msg_01kxcm57veataympk64zyrqz20
Nighthawk    340 output tokens   msg_01kxcm5bph2hcp3gn5yq71wr7w
Mustang      3352 output tokens  msg_01kxcm5bzhbxfvp94erj3z3c7e
  • Final exact-head verification:
    • git range-diff confirmed all 10 prepared commits were patch-identical after the server-side rebase.
    • Blacksmith Testbox tbx_01kxecpe28z66hyfwn4ctm8tc2 passed 64 ClickClack tests, 144 outbound delivery tests, and 4 message-planning tests.
    • ClickClack PR Linux/Windows Clawdbot Apps #75 passed Go, TypeScript, Docker, Playwright, Linux, macOS, and Windows checks before landing.
    • OpenClaw channel and plugin contract checks passed; unrelated failures were reproduced on the then-current main.

Root Cause

  • Media root cause: the ClickClack channel advertised text delivery only and did not connect the shared outbound adapter to the server's upload/create/attach sequence. Core therefore dropped mediaUrl and used its text fallback.
  • Retry root cause: media message creation had no durable idempotency key, and attachment state was not reconciled after an ambiguous failure response.
  • Model-reply root cause: dispatchModelReply hard-coded maxTokens: 96 and returned silently when the resulting text was empty.
  • Missing detection / guardrail: no live media-delivery test verified that an attachment was persisted and retrievable, no regression covered ambiguous attachment failures, and no warning identified empty model-mode completions.

User-visible / Behavior Changes

  • ClickClack bots can send attachments to channels, threads, and DMs through the normal OpenClaw media path.
  • Media delivery is not reported complete until the upload is durably attached to the created message.
  • Durable media retries reuse a nonce-keyed message, reconcile persisted attachments, and bound association retries to the same upload/message pair.
  • Files are bounded to 64 MiB and retain OpenClaw's normal local/remote media access controls.
  • replyMode: "model" omits a ClickClack-specific maxTokens cap, allowing the selected runtime and model output budget to apply.
  • Empty model-mode completions produce a warning with the account id.

Compatibility / Migration

  • Backward compatible? (Yes/No): Yes
  • Config/env changes? (Yes/No): No
  • Migration needed? (Yes/No): No

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: L triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. labels Jul 13, 2026
@clawsweeper

clawsweeper Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 12, 2026, 11:51 PM ET / July 13, 2026, 03:51 UTC.

Summary
The branch adds ClickClack media upload and attachment delivery with idempotent retry reconciliation, makes direct model-reply token limits optional and configurable per account, adds empty-completion diagnostics, and updates tests, docs, and generated config metadata.

PR surface: Source +275, Tests +392, Docs +13, Generated 0. Total +680 across 13 files.

Reproducibility: yes. from source and supplied live evidence: current ClickClack lacks a media sender and the prior model path used a fixed 96-token completion budget, but this review did not independently execute a current-main reproduction.

Review metrics: 1 noteworthy metric.

  • Config/default surfaces: 1 added, 1 changed. The PR adds account-level maxTokens and changes the unset behavior from a fixed 96-token cap to the selected runtime/model default, which requires an ownership and upgrade review.

Stored data model
Persistent data-model change detected: serialized state: extensions/clickclack/src/http-client.test.ts, unknown-data-model-change: src/config/bundled-channel-config-metadata.generated.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Resolve the merge conflict against current main and rerun focused ClickClack validation on the exact refreshed head.
  • Have the likely owner choose whether the account-level token-budget surface remains or is split out.

Risk before merge

  • [P1] The latest PR head conflicts with current main, so a refreshed merge result could alter the reviewed delivery and generated-metadata surfaces.
  • [P1] The new ClickClack account-level maxTokens setting overlaps existing provider/model token-budget configuration and creates a second source of policy for the same model call.
  • [P1] Durable retry safety relies on the deployed ClickClack server honoring message nonces consistently for channel, thread, and direct-message creation; the supported server-version contract and older-server behavior are not documented in this PR.

Maintainer options:

  1. Split the configuration decision (recommended)
    Refresh the branch, retain the proven media and unset-runtime-default fixes, and remove the account-level token option until a maintainer sponsors that additional config surface.
  2. Approve and prove the full contract
    Keep the combined change only after an owner approves account-scoped budgets and the refreshed head documents precedence plus supported ClickClack nonce behavior across upgrades.
  3. Pause the combined PR
    Close or supersede this branch if resolving the conflict and separating product direction would discard most of the current combined patch.

Next step before merge

  • [P2] A maintainer should choose the permanent token-budget ownership, require a conflict-free refreshed head, and confirm the ClickClack nonce compatibility contract before merge.

Maintainer decision needed

  • Question: Should ClickClack expose its own per-account maxTokens override, or should model replies rely only on the existing provider/model budget with the hard-coded 96-token cap removed?
  • Rationale: Both approaches are technically viable, but choosing a second channel-owned budget surface changes configuration ownership and long-term user expectations; repository policy sets a high bar for new config and the existing model configuration already controls output limits.
  • Likely owner: steipete — This choice governs both ClickClack product behavior and OpenClaw configuration ownership, and steipete is the strongest available owner for both surfaces.
  • Options:
    • Use runtime model budgets (recommended): Merge the media and diagnostic fixes while removing ClickClack maxTokens, so unset and configured model-provider defaults remain the single token-budget authority.
    • Approve account-level overrides: Keep channels.clickclack.maxTokens only with explicit owner approval, a documented same-model multi-account use case, and tests explaining precedence over provider/model defaults.

Security
Cleared: The diff adds no dependency, workflow, secret-permission, package-resolution, or executable-download change, and media loading remains behind the shared outbound-media access boundary.

Review details

Best possible solution:

Refresh the branch onto current main, retain the plugin-owned media delivery and runtime-default fallback, then either remove the account-level token option or obtain explicit owner approval for its distinct per-account use case; also document and test the minimum ClickClack nonce contract needed for retry-safe channel, thread, and DM delivery.

Do we have a high-confidence way to reproduce the issue?

Yes from source and supplied live evidence: current ClickClack lacks a media sender and the prior model path used a fixed 96-token completion budget, but this review did not independently execute a current-main reproduction.

Is this the best way to solve the issue?

Partly: implementing media inside the ClickClack plugin and deferring unset budgets to the runtime are the narrowest fixes, while the additional account-level token setting is not yet shown to be better than the existing provider/model configuration.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 6dfa4c27a3ad.

Label changes

Label justifications:

  • P2: This is a bounded ClickClack reliability improvement with strong proof and limited channel-specific blast radius, but it is not an emergency or active repository-wide regression.
  • merge-risk: 🚨 compatibility: The PR adds a new account configuration contract, changes the default model-budget behavior, and depends on an explicit server nonce capability for retry guarantees.
  • merge-risk: 🚨 message-delivery: The patch changes when ClickClack media sends are considered complete and how retries reuse or reconcile messages, uploads, and attachments.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR provides convincing after-fix live ClickClack API output, persisted attachment details, visible attachment and preview screenshots, retry results, and five-account model-reply observations; private identifiers appear redacted or synthetic.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR provides convincing after-fix live ClickClack API output, persisted attachment details, visible attachment and preview screenshots, retry results, and five-account model-reply observations; private identifiers appear redacted or synthetic.
Evidence reviewed

PR surface:

Source +275, Tests +392, Docs +13, Generated 0. Total +680 across 13 files.

View PR surface stats
Area Files Added Removed Net
Source 7 318 43 +275
Tests 4 394 2 +392
Docs 1 27 14 +13
Config 0 0 0 0
Generated 1 18 18 0
Other 0 0 0 0
Total 13 757 77 +680

Acceptance criteria:

  • [P1] pnpm test extensions/clickclack/src/inbound.test.ts extensions/clickclack/src/accounts.test.ts extensions/clickclack/src/outbound.test.ts extensions/clickclack/src/http-client.test.ts.
  • [P1] pnpm tsgo -- -p test/tsconfig/tsconfig.extensions.test.json.
  • [P1] node --import tsx scripts/generate-bundled-channel-config-metadata.ts --check.
  • [P1] node scripts/format-docs.mjs --check.
  • [P1] git diff --check.

What I checked:

  • Media delivery implementation: The PR registers ClickClack media capability and routes both durable and legacy outbound media calls through the plugin-owned sender while preserving shared media-access inputs. (extensions/clickclack/src/channel.ts:42, ae8d45188961)
  • Retry and API surface: The branch adds upload, attachment, message reconciliation, and message nonce support to the ClickClack client and media sender, with focused ambiguous-failure and durable-retry coverage. (extensions/clickclack/src/outbound.ts:10, ae8d45188961)
  • Configuration contract: The branch adds one optional account-level maxTokens field bounded from 1 through 32768 and omits the completion argument when it is unset. (extensions/clickclack/src/config-schema.ts:20, ae8d45188961)
  • Existing model-budget surface: Current OpenClaw documentation already defines provider-level and per-model maxTokens settings, so a second channel-account budget surface needs an explicit ownership and product rationale. (github.com) Public docs: docs/concepts/model-providers.md. (docs/concepts/model-providers.md:15, 6dfa4c27a3ad)
  • Real behavior proof: The PR body records successful live upload, message creation, attachment association and retrieval, visible ClickClack attachment screenshots, retry reconciliation behavior, and five-account model-reply runs with configured and unset limits. (ae8d45188961)
  • Current merge state: GitHub reports the latest head as not cleanly mergeable with mergeable state dirty, so the exact merge result has not been reviewed or validated. (ae8d45188961)

Likely related people:

  • steipete: ClickClack is identified among Peter Steinberger's active OpenClaw projects, making him the strongest available owner for the account-level model-budget product decision. (github.com) (role: ClickClack product and adjacent repository owner; confidence: high; files: extensions/clickclack/src/channel.ts, extensions/clickclack/src/inbound.ts, docs/channels/clickclack.md)
  • zsxsoft: Recent OpenClaw release provenance credits this contributor in the security/content-boundary work that added ClickClack inbound allowlist enforcement, making them relevant for adjacent channel behavior review. (github.com) (role: recent ClickClack behavior contributor; confidence: medium; files: extensions/clickclack/src/inbound.ts)
  • joshavant: Recent release history shows repeated work across channel delivery, outbound media, and model/runtime boundaries, making this person a useful secondary reviewer for the shared delivery contract. (github.com) (role: recent channel and outbound-path contributor; confidence: low; files: src/infra/outbound/deliver.ts, src/plugin-sdk/outbound-media.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (5 earlier review cycles)
  • reviewed 2026-07-13T00:25:33.169Z sha 5d8fc60 :: needs real behavior proof before merge. :: [P1] Make attachment failure retry-safe
  • reviewed 2026-07-13T00:32:16.680Z sha 5d8fc60 :: needs real behavior proof before merge. :: [P1] Make attachment failure retry-safe
  • reviewed 2026-07-13T01:38:28.601Z sha 1da33bf :: found issues before merge. :: [P1] Do not default accounts to a budget that drops every reply
  • reviewed 2026-07-13T02:00:06.023Z sha cedad53 :: found issues before merge. :: [P1] Stop defaulting to the known failing 96-token cap
  • reviewed 2026-07-13T03:01:48.041Z sha 0e3fead :: needs maintainer review before merge. :: none

@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jul 13, 2026
@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 13, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the triage: needs-pr-context Candidate: external PR body lacks required problem context or evidence. label Jul 13, 2026
@jjjhenriksen

Copy link
Copy Markdown
Contributor Author

@clawsweeper review

@clawsweeper

clawsweeper Bot commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 13, 2026
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
@shakkernerd
shakkernerd force-pushed the codex/clickclack-send-media branch from f2c6d2a to 80b44b0 Compare July 13, 2026 18:35
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
@shakkernerd
shakkernerd force-pushed the codex/clickclack-send-media branch 2 times, most recently from 16968ff to 0db17a0 Compare July 13, 2026 18:38
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
@shakkernerd
shakkernerd force-pushed the codex/clickclack-send-media branch from 0db17a0 to f65dc98 Compare July 13, 2026 18:39
shakkernerd added a commit to jjjhenriksen/openclaw that referenced this pull request Jul 13, 2026
@shakkernerd
shakkernerd force-pushed the codex/clickclack-send-media branch from f65dc98 to b65a255 Compare July 13, 2026 18:46
@shakkernerd
shakkernerd force-pushed the codex/clickclack-send-media branch from b65a255 to 51a19f2 Compare July 13, 2026 18:52
@shakkernerd
shakkernerd merged commit 72b42f0 into openclaw:main Jul 13, 2026
91 of 102 checks passed
@shakkernerd

shakkernerd commented Jul 13, 2026

Copy link
Copy Markdown
Member

Merged using rebase.

What changed after review:

  • Routed ClickClack media replies through required delivery and reused owner-scoped upload and message nonces across retries.
  • Added nonce lookup recovery that repairs persisted attachment state without rereading source media and recovers exact message IDs after uncertain sends.
  • Added fail-closed handling when older ClickClack servers cannot prove an unknown send, and used the selected provider and model's runtime output budget instead of a channel-level token cap.

Verification:

  • git range-diff: all 10 prepared commits are identical after the server-side rebase.
  • Blacksmith Testbox tbx_01kxecpe28z66hyfwn4ctm8tc2: 64 ClickClack tests, 144 outbound delivery tests, and 4 message-planning tests passed.
  • Current-main baseline reproduced the unrelated UI request-budget, Kysely guardrail, formatting, dead-export, and test-type failures; the PR-specific plugin/channel contract lanes passed.
  • No required checks are configured for the PR branch.

Landed on main:

  • Range: aea2dd6ab256c0e9cc75574683c524f7591ee4cd..72b42f0ed751ee8d2e4e5625a6477e27a0af972b
  • Final landed SHA: 72b42f0ed751ee8d2e4e5625a6477e27a0af972b

Thanks @jjjhenriksen!

@shakkernerd shakkernerd changed the title fix(clickclack): deliver media and configurable model replies [AI-assisted] fix: deliver ClickClack media and use runtime model budgets [AI-assisted] Jul 13, 2026
wm0018 pushed a commit to wm0018/openclaw that referenced this pull request Jul 14, 2026
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants