Conversation
- Drop userinfo from the opened dashboard URL - Stop appending the shared token inside an existing fragment - Keep the route off the query string Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c998b504-ca22-49c5-8712-15da55226686
|
Codex review: blocked before merge. Reviewed September 25, 2026, 3:56 PM ET / 19:56 UTC (Revision 7). ClawSweeper reviewWhat this changesThe tray now assembles dashboard links from URL components, removes old URL credentials, and tests path, query, fragment, and scheme handling. Merge readiness⛔ Blocked before merge - 5 items remain This PR remains useful because current main still constructs dashboard URLs by appending a route to the whole address. The current patch fixes that behavior, but a previously identified invalid-address recovery defect remains at the unchanged PR head. Priority: P2 Review scores
Verification
How this fits togetherThe tray takes a saved Gateway address, an optional dashboard route, and the selected credential, then builds a link for the browser or returns it through the local app capability. Those links determine which dashboard page opens and whether a shared token reaches it. flowchart LR
A[Saved Gateway address] --> D[Dashboard URL builder]
B[Dashboard route] --> D
C[Selected credential] --> D
D --> E[Validate scheme and remove old credentials]
E --> F[Browser launch]
E --> G[Local app capability]
Before merge
Findings
Agent review detailsSecurityNone. Review metrics
Merge-risk optionsMaintainer options:
Copy recommended automerge instructionTechnical reviewBest possible solution: Keep the stricter URL construction, make rejected saved addresses lead to Connection settings or a clear app-capability error, and land with current-head browser proof and a passing required CI Gate. Do we have a high-confidence way to reproduce the issue? Yes for the caller defect from source: a nonempty unsupported saved address passes credential resolution, then the new builder throws before tray recovery handling. I did not execute the Windows app in this read-only review. Is this the best way to solve the issue? Yes for the URL component repair, but not yet for caller recovery: handle validation failure at both entry points while retaining the strict scheme check. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning medium; reviewed against 5a59535216ee. LabelsLabel changes: No label changes. Label justifications:
EvidenceAcceptance criteria:
What I checked:
Likely related people:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale
Overall follows the weaker of proof and patch quality. Workflow
HistoryReview history (6 earlier review cycles)
|
|
Global triage: TAKE_AFTER_CHECKS. Take confidence 85%; recommendation confidence 90%; effort extra-small; risk low. Reviewed exact head Owner: maintainer. Complete the declared browser-launch |
A scheme-less value such as localhost:18789 parses as an absolute URI with scheme localhost, and the dashboard builder then opened the wrong host. Accept only http, https, ws, and wss. Test: GatewayDashboardUrlBuilderTests 8 passed. Signed-off-by: Sebastien Tardif <SebTardif@ncf.ca>
|
The scheme-less edge is closed on Browser launch on that head: dev-identity Debug tray, disposable profile, dummy shared token, then The protocol delivered the path The three red setup E2E jobs on |
Preserve SebTardif's dashboard commits while integrating the latest setup and migration fixes from main. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c998b504-ca22-49c5-8712-15da55226686
What Problem This Solves
Open Dashboard previously appended a route to the whole gateway URL, so a base query or fragment swallowed the route. It could also retain userinfo or an old token fragment. A route with its own query later produced two
?delimiters instead of combining the queries.User Impact
The opened URL has no userinfo or old fragment. The route stays in the path, route query parameters precede gateway query parameters, and only the active shared gateway token appears in the fragment. Literal and percent-encoded
tokenquery names from either source are removed, including when no shared token is appended.Why This Change Was Made
The contributor's URI-based builder separates host, path, query, and fragment. The follow-up patch splits query and fragment from the optional relative route before joining it with the existing gateway path and query; it preserves the contributor's approach and original commits. Seb's
c869ed59commit rejects URI input whose scheme is not http, https, ws, or wss; it retains the query and fragment repair. Merge commit8ea08dcdintegrates then-currentmain(5a595352) without rewriting Seb's commits. The PR diff against that base is still only the builder and its tests.Change Type
Scope
Required proof pools
windows-winui-interactive: Open Dashboard browser launch; the earlier live address-bar observation is fromc869ed59. No current-merge-head screenshot or browser launch was collected. The current-head app/MCP proof below is not a substitute for visual browser proof.Validation
At exact merge head
8ea08dcddb7ddb0a4a7ed92d30bfe260a3057f03in the isolated worktree on Windows ARM64:.\build.ps1: passed, including documentation validation and full Debug build.dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore: 4104 passed, 35 skipped, 0 failed.dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore: 3120 passed, 0 failed.dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore --filter FullyQualifiedName~GatewayDashboardUrlBuilderTests: 8 passed, 0 failed, includingBuild_RejectsSchemeLessGatewayInput.git diff --check origin/main..HEAD: passed. Scoped rubber-duck review after merging main: no actionable findings in the builder, tests, or caller contracts.python .agents\skills\autoreview\scripts\autoreview --mode branch --base origin/mainrefused to bundle the synthetic userinfo/token test fixture as secret-like content before reviewer invocation. Its refusal is not a clean autoreview result; the helper was not bypassed or weakened.Real behavior proof
8ea08dcddb7ddb0a4a7ed92d30bfe260a3057f03(parentsc869ed59,5a595352).tools/listexposedapp.dashboard.url;tools/callwithpath=config?tab=one&token=old-route#old-routereturned the URL shapehttp://127.0.0.1:43179/ui/config?tab=one&x=1#token=[REDACTED],hasTokenQuery=false, andcredentialSource=record.SharedGatewayToken. The input gateway URL also had an encoded token query key and an old fragment; neither appeared in the output. The isolated app process was stopped and the disposable profile removed.c869ed59: Dev-identity Debug tray, disposable profile, dummy shared token. Activatedopenclaw-dev://dashboard/configwith a route query. Microsoft Edge opened. The live address bar readhttp://127.0.0.1:43179/ui/config?x=1#token=[REDACTED]. The route is on the path, saved gateway query remains, and old token query and fragment are absent. A screen copy was unusable, so none was attached. The protocol delivered onlyconfig, nottab=one; the route query composition is covered by the current-head MCP call and unit test.localhost:18789/uithrows instead of parsing as a URI whose scheme islocalhost.Security Impact
No new permissions, capabilities, or network calls. Existing URL credentials are handled more narrowly: userinfo and previous fragments are discarded; literal and percent-encoded token query keys are filtered; the selected shared token is escaped into the single fragment.
Compatibility and Migration
No configuration changes or migration. Existing path-only callers and dashboard root URLs remain supported.
Exact-head CI disposition
Build and Test run
36178424792at exact head8ea08dcdfinished red on both attempts. The full first attempt passed Setup/connect, Network recovery, Tray/setup/integration, and UI/functional/accessibility, but Revocation recovery E2E failed during wizard Gateway restart. Failed-jobs-only attempt 2 again passed Setup/connect (108222344541) and Network recovery (108222337744), while Revocation (108222289480) failed 1/1 with a slow SQLite coordinator lock wait onstate.write,StateDatabaseCoordinatorContentionError: another OpenClaw process owns state-lifecycle, thenGatewayRestartPreparationError: GATEWAY_RESTART_PREPARATION_REFUSED. CI Gate (108225835344) failed. This is not a dashboard URL assertion; it is a repeated Gateway state-lifecycle contention failure in the setup/recovery path. The PR is parked with required CI red. No further rerun, admin bypass, or merge is claimed. Resolution requires investigating/clearing that contention and obtaining a green required CI Gate on the current PR head.