- -
-
Available Extra Accountsis effectively empty.
- Accounts in Poolshows0 in pool.
- - The saved disabled member is invisible, so the provider-owned pool looks unsaved. -
diff --git a/.github/pr-assets/585/after-agent-codex-pool.png b/.github/pr-assets/585/after-agent-codex-pool.png deleted file mode 100644 index f4e0ee41..00000000 Binary files a/.github/pr-assets/585/after-agent-codex-pool.png and /dev/null differ diff --git a/.github/pr-assets/585/after-provider-overview.png b/.github/pr-assets/585/after-provider-overview.png deleted file mode 100644 index 8fb53626..00000000 Binary files a/.github/pr-assets/585/after-provider-overview.png and /dev/null differ diff --git a/.github/pr-assets/585/before-agent-codex-pool.png b/.github/pr-assets/585/before-agent-codex-pool.png deleted file mode 100644 index 620457b1..00000000 Binary files a/.github/pr-assets/585/before-agent-codex-pool.png and /dev/null differ diff --git a/.github/pr-assets/585/before-provider-overview.png b/.github/pr-assets/585/before-provider-overview.png deleted file mode 100644 index 353a6ea8..00000000 Binary files a/.github/pr-assets/585/before-provider-overview.png and /dev/null differ diff --git a/.github/pr-assets/585/index.html b/.github/pr-assets/585/index.html deleted file mode 100644 index 65f0573a..00000000 --- a/.github/pr-assets/585/index.html +++ /dev/null @@ -1,467 +0,0 @@ - - -
- - -
- This comparison uses two real local GoClaw dashboards seeded with the same fixture data.
- The only difference is the code revision:
- main@b38a078e versus fix@faf98c73.
- The screenshots below isolate the two regressions fixed by the PR: hidden saved pool
- membership on provider pages, and sticky custom routing state on agent pages.
-
- The provider page should show saved pool membership even when an extra account is disabled - or not ready. Before the fix, the page derived membership only from quota-fetched ready - accounts, so the saved member disappeared entirely. -
- -
- The pool owner codex-owner had a saved extra member
- codex-disabled, but the UI rendered 0 in pool, an empty
- account list, and no selectable extra account.
-
- The page now renders membership from the saved provider settings, while still limiting - quota lookups to ready accounts only. The disabled member remains visible and clearly - labeled as blocked. -
-
- Available Extra Accounts is effectively empty.Accounts in Pool shows 0 in pool.
- Codex Disabled is visible in Available Extra Accounts.Accounts in Pool correctly shows 2 in pool.
- When an agent had no explicit routing override and the provider had no saved pool yet,
- the UI should have represented that state as inherit / use provider defaults.
- Before the fix, the draft model incorrectly materialized it as a saved custom
- primary_first + [] state.
-
- The agent page defaulted to Custom For This Agent and framed the agent as
- if it had its own routing policy, even though there was no provider-owned pool and no
- explicit agent override saved.
-
- The draft state now preserves a true inherit mode. The UI shows
- Use Provider Defaults and clarifies that the agent stays on its primary
- account until provider-owned pool members are later added.
-
- Custom For This Agent is selected by default.
- Use Provider Defaults is selected.system + a local owner token, and seeded through the HTTP API with the same
- provider / agent records before capture.
- - This PR has no product UI. The reviewer surface is wire behavior: - how long tool-call IDs are serialized and how prefixed OpenAI-compatible - model IDs are classified. The visuals below show the exact before/after - deltas that matter for issue #532. -
-openai/o3-mini bypassed capability gates.- The original defensive fallback capped IDs by slicing the first 40 characters. - That stops the HTTP 400, but it still lets two distinct long IDs collapse into - the same wire value if they only diverge after character 40. -
- -Fresh live tool calls were already hashed upstream, but resumed history and replay paths still depended on the serializer. That meant the bug could survive in exactly the sessions reviewers care about: legacy, resumed, or replayed state.
-Every OpenAI-compatible request path uses the same request builder. Fixing the boundary closes the main loop and the side loops together instead of patching each caller independently.
-- Two distinct IDs from a replayed or deduped session can become the same - outbound value. The request is shorter, but the assistant tool calls and - tool results are no longer uniquely identifiable. -
-{
- "tool_calls": [
- { "id": "call_0123456789abcdef0123456789abcdef012" },
- { "id": "call_0123456789abcdef0123456789abcdef012" }
- ],
- "messages": [
- { "role": "tool", "tool_call_id": "call_0123456789abcdef0123456789abcdef012" },
- { "role": "tool", "tool_call_id": "call_0123456789abcdef0123456789abcdef012" }
- ]
-}
-
- IDs longer than 40 characters are now re-encoded as deterministic
- call_-prefixed hashes. The same original ID always maps
- to the same shortened value, and different long IDs stay different.
-
{
- "tool_calls": [
- { "id": "call_6625d2d3e5ec2c6c86f70fd9a7064cc77a1" },
- { "id": "call_60b8d9101dbdde451723a0888a84317d14f" }
- ],
- "messages": [
- { "role": "tool", "tool_call_id": "call_6625d2d3e5ec2c6c86f70fd9a7064cc77a1" },
- { "role": "tool", "tool_call_id": "call_60b8d9101dbdde451723a0888a84317d14f" }
- ]
-}
-
- The request builder already supports provider-prefixed IDs such as
- openai/o3-mini. The bug was that capability checks ran on the
- full string, so prefixed reasoning models could keep temperature
- and use the wrong token field.
-
openai/o3-mini- Because the gate looked at the full model string, the builder missed - both the reasoning-model token routing and the temperature skip. -
-{
- "model": "openai/o3-mini",
- "max_tokens": 123,
- "temperature": 0.7
-}
- - The builder now strips transport prefixes once, then applies the same - capability logic to both bare and prefixed model IDs. -
-{
- "model": "openai/o3-mini",
- "max_completion_tokens": 123
-}
- openai/o3-mini now follows the same route as o3-mini.openai/gpt-5.4 still keeps temperature, matching the flagship-model rule.- The changes above were verified with focused provider and agent tests, plus - a full-suite spot check to expose unrelated red tests explicitly rather than - hide them under a green subset. -
- -go test ./internal/providers ./internal/agentgo test ./internal/providers -run 'TestTruncateToolCallID|TestBuildRequestBody' -count=1go test ./internal/agent -run '^TestUniquifyToolCallIDs$' -count=1
- go test ./... still fails in pkg/browser at
- TestResolveRemoteCDP_DefaultPort with
- /json/version returned HTTP 404. This pre-exists the provider
- changes and is unrelated to the OpenAI compatibility patch.
-
- This evidence pack documents the user-facing impact of the channel-health diagnostics
- work for issue #628 and the follow-up UI hardening that landed during review.
- The screenshots show the same seeded scenarios before the PR and after the current draft
- head, so the deltas are attributable to this branch rather than a different test setup.
-
- The screenshots validate the visible remediation experience. The code changes go a bit - further than the screenshots alone, so the report separates visual proof from the - additional hardening that prevents misleading UI states. -
-- The dashboard summary is the first place a user looks. It now leads toward the richer diagnostics - instead of leaving the channel state effectively opaque. -
-
-
- - This is where the PR most clearly replaces vague channel status with named failures and next-step copy. -
-
-
-
- This captures the original class of incident from #628: a channel is enabled but blocked by
- auth/runtime reality. The page now explains that state instead of flattening it.
-
-
- - Missing or incomplete channel configuration now gets the same structured treatment as auth failures. -
-
-
- - Review surfaced a few cases where the visible diagnostics could still be misleading. Those are fixed in - code even when they do not have a dedicated screenshot in this pack. -
-Checking.zalo_personal now points to re-auth instead of generic credentials repair.?tab= values now fall back to general.groups tab.- These structured checks back up the screenshots by recording the UI markers that were present before and after. -
-{
- "overview": {
- "needsAttention": true,
- "authChannelVisible": true,
- "missingChannelVisible": false
- },
- "channelsList": {
- "authSummary": false,
- "missingSummary": true,
- "nextStepVisible": true,
- "credentialsActionVisible": false
- },
- "authDetail": {
- "whatHappened": true,
- "recommendedAction": true,
- "reviewCredentials": false,
- "technicalDetail": false
- },
- "missingCredentialsDetail": {
- "missingCredentials": true,
- "completeRequiredCredentials": false,
- "openCredentials": false
- }
-}
- {
- "overview": {
- "needsAttention": true,
- "authVisible": false,
- "missingVisible": false
- },
- "channelsList": {
- "authSummary": true,
- "missingSummary": false,
- "reviewCredentials": true,
- "completeCredentials": true
- },
- "authDetail": {
- "whatHappened": true,
- "authFailed": true,
- "recommendedAction": true,
- "openCredentials": true,
- "technicalDetail": true
- },
- "missingDetail": {
- "whatHappened": true,
- "configInvalid": true,
- "completeCredentials": true,
- "openCredentials": true,
- "technicalDetail": true
- }
-}
- #628
- is better described as diagnosable and actionable, not automatically healed.
- - nextlevelbuilder/goclaw#671 · - Closes #670 · - Relates #583 -
- -Dashed primary border + icon badge + "Click to add" hint. Unmistakably interactive in both themes.
-Backend skips unknown members instead of blocking saves. Deleted/disabled providers no longer cause errors.
-Pool members now show which pool they belong to, with a direct link to the owner provider.
-Per-card "Pool available" badge replaces verbose info banner. One-click wizard to create pools from unpooled accounts.
-Pool members hidden from agent provider dropdown. Only pool owners listed — routing handles members automatically.
-Before: bare text, no icon, invisible border in dark mode. After: dashed primary border, + icon badge, "Click to add" label.
-
-
- Before: pool section completely hidden, no explanation. After: "Pool Defaults" section shows owner name + clickable link.
-
-
- Before: verbose info banner with pool stats took up space. After: clean per-card "Pool available" badge on each unpooled account.
-
-
- Before: pool member (codex-secondary) shown as standalone option, no pool indicator. After: member hidden, pool owner shows "Pool" badge so users know it routes to multiple accounts.
-
-
- New one-click wizard dialog opened from any "Pool available" badge. Select owner, members, strategy — all in one step.
-
- PR #730 — Closes #729
- -First conversation click from clean state shows empty placeholder instead of messages
-skipNextHistoryRef unconditionally set on empty→non-empty transition, skipping loadHistory()
Guard skip with expectingRunRef.current — only active during new-chat send flow
- Before: Clicking "Chat a95c8ffa" from initial state — conversation highlighted but main area shows "Start a conversation" placeholder. Messages never load.
-
- After: Same click — conversation messages load immediately. The 5-message history is displayed correctly on first click.
-PR #748 — visual proof pack for issue #739
- -Active workspace files under deny-roots were rejected by exec even when they belonged to the current upload/team scope.
Path exemptions were static and non-shell-aware, so quoted, prefixed, and legacy screenshot-era upload paths still matched the deny root.
-Shell-aware parsing + canonical path checks now exempt the active personal .uploads subtree, the legacy uploads subtree, and the active team workspace.
claw:3000 backed by the unfixed /opt/goclaw deployment (v2.7.1). After source: temporary PR deployment on claw:3001, backed by goclaw-pr748:local built from the fixed code commit 83fa1342. Both UI captures use fresh chats with the same user and GLM thục bô. Callout border marks the reviewed exec row.
-
- Stable claw release, fresh chat with GLM thục bô: the agent runs the exact absolute /app/.goclaw/.../.uploads/...jpg copy command and the exec row fails with the safety-policy .goclaw/ denial.
- Temporary fixed deployment on claw:3001, fresh chat with the same agent: the same absolute /app/.goclaw/.../.uploads/...jpg copy command now completes successfully and returns /tmp/partner-abs.png.
$ ssh claw 'docker run --rm -v /tmp/goclaw-739-before:/src -w /src golang:1.26 sh -lc "/usr/local/go/bin/go test ./cmd -run TestSetupToolRegistryExecWorkspacePaths -count=1 -v"' -=== RUN TestSetupToolRegistryExecWorkspacePaths -=== RUN TestSetupToolRegistryExecWorkspacePaths/personal_workspace_prefixed_uploads_allowed -gateway_setup_exec_workspace_test.go:133: denied = true, want false; output = command denied by safety policy: matches pattern /tmp/TestSetupToolRegistryExecWorkspacePaths.../001 -=== RUN TestSetupToolRegistryExecWorkspacePaths/team_workspace_quoted_input_allowed -gateway_setup_exec_workspace_test.go:133: denied = true, want false; output = command denied by safety policy: matches pattern /tmp/TestSetupToolRegistryExecWorkspacePaths.../001 -=== RUN TestSetupToolRegistryExecWorkspacePaths/legacy_dotgoclaw_uploads_layout_allowed -gateway_setup_exec_workspace_test.go:133: denied = true, want false; output = command denied by safety policy: matches pattern /tmp/TestSetupToolRegistryExecWorkspacePaths.../001 -FAIL-
Baseline source on claw: the exact gateway wiring still rejects all three representative workspace-path forms.
$ go test ./cmd -run TestSetupToolRegistryExecWorkspacePaths -count=1 -v -=== RUN TestSetupToolRegistryExecWorkspacePaths -=== RUN TestSetupToolRegistryExecWorkspacePaths/personal_workspace_prefixed_uploads_allowed -=== RUN TestSetupToolRegistryExecWorkspacePaths/team_workspace_quoted_input_allowed -=== RUN TestSetupToolRegistryExecWorkspacePaths/legacy_dotgoclaw_uploads_layout_allowed ---- PASS: TestSetupToolRegistryExecWorkspacePaths (0.01s) - --- PASS: personal_workspace_prefixed_uploads_allowed - --- PASS: team_workspace_quoted_input_allowed - --- PASS: legacy_dotgoclaw_uploads_layout_allowed -PASS-
Current worktree: the same gateway path handling now passes for personal uploads, team workspace paths, and the screenshot-era legacy .goclaw/.../uploads layout.
claw
-
- This earlier live run documents the same production agent and workspace context on stable claw. The report’s primary Before/After pair above is the clean isolated proof you asked for; this screenshot is kept as supporting context for the reproduction journey.
-
.uploads subtree, the legacy .goclaw/.../uploads subtree, or the active team workspace.dataDir files, and workspace-local .goclaw/* remain denied.claw:3000 Before and temporary fixed claw:3001 After, both using fresh conversations.