Add CALLBACK_BASE_URL config and default it to http://localhost when unset.
Build OpenClaw dispatch callback_url from CALLBACK_BASE_URL instead of LISTEN_ADDR.
Add tests for config fallback/env override and callback URL generation behavior.
Update .env.example and README config documentation.
Test Plan
go test ./internal/config -run CallbackBaseURL -v
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
Notes
LISTEN_ADDR remains server bind address only.
callback_url is now deployment-friendly while still working locally by default.
## Summary
- Add `CALLBACK_BASE_URL` config and default it to `http://localhost` when unset.
- Build OpenClaw dispatch `callback_url` from `CALLBACK_BASE_URL` instead of `LISTEN_ADDR`.
- Add tests for config fallback/env override and callback URL generation behavior.
- Update `.env.example` and README config documentation.
## Test Plan
- [x] `go test ./internal/config -run CallbackBaseURL -v`
- [x] `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- [x] `go test ./...`
## Notes
- `LISTEN_ADDR` remains server bind address only.
- `callback_url` is now deployment-friendly while still working locally by default.
Separate callback URL generation from LISTEN_ADDR by introducing CALLBACK_BASE_URL with a localhost default for local development.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
thuanle
requested review from codex 2026-04-27 19:05:20 +07:00
[High] CALLBACK_BASE_URL default vẫn tạo callback URL sai cho setup mặc định đang được document. internal/config/config.go:76-80 default listener là :8080 nhưng default callback base lại là http://localhost, và internal/ai_client/client.go:133-138 sẽ build thành http://localhost/callback thay vì http://localhost:8080/callback. Mismatch này cũng xuất hiện trong .env.example:24-25, README.md:76-77, và test expectation ở internal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
go test ./internal/config -run CallbackBaseURL -v
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
FAIL
1. [High] `CALLBACK_BASE_URL` default vẫn tạo callback URL sai cho setup mặc định đang được document. `internal/config/config.go:76-80` default listener là `:8080` nhưng default callback base lại là `http://localhost`, và `internal/ai_client/client.go:133-138` sẽ build thành `http://localhost/callback` thay vì `http://localhost:8080/callback`. Mismatch này cũng xuất hiện trong `.env.example:24-25`, `README.md:76-77`, và test expectation ở `internal/config/config_test.go:24-35`. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
- `go test ./internal/config -run CallbackBaseURL -v`
- `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- `go test ./...`
[High] CALLBACK_BASE_URL default vẫn tạo callback URL sai cho setup mặc định đang được document. internal/config/config.go:76-80 default listener là :8080 nhưng default callback base lại là http://localhost, và internal/ai_client/client.go:133-138 sẽ build thành http://localhost/callback thay vì http://localhost:8080/callback. Mismatch này cũng xuất hiện trong .env.example:24-25, README.md:76-77, và test expectation ở internal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
go test ./internal/config -run CallbackBaseURL -v
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
FAIL
1. [High] `CALLBACK_BASE_URL` default vẫn tạo callback URL sai cho setup mặc định đang được document. `internal/config/config.go:76-80` default listener là `:8080` nhưng default callback base lại là `http://localhost`, và `internal/ai_client/client.go:133-138` sẽ build thành `http://localhost/callback` thay vì `http://localhost:8080/callback`. Mismatch này cũng xuất hiện trong `.env.example:24-25`, `README.md:76-77`, và test expectation ở `internal/config/config_test.go:24-35`. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
- `go test ./internal/config -run CallbackBaseURL -v`
- `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- `go test ./...`
[High] CALLBACK_BASE_URL default vẫn tạo callback URL sai cho setup mặc định đang được document. internal/config/config.go:76-80 default listener là :8080 nhưng default callback base lại là http://localhost, và internal/ai_client/client.go:133-138 sẽ build thành http://localhost/callback thay vì http://localhost:8080/callback. Mismatch này cũng xuất hiện trong .env.example:24-25, README.md:76-77, và test expectation ở internal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
go test ./internal/config -run CallbackBaseURL -v
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
FAIL
1. [High] `CALLBACK_BASE_URL` default vẫn tạo callback URL sai cho setup mặc định đang được document. `internal/config/config.go:76-80` default listener là `:8080` nhưng default callback base lại là `http://localhost`, và `internal/ai_client/client.go:133-138` sẽ build thành `http://localhost/callback` thay vì `http://localhost:8080/callback`. Mismatch này cũng xuất hiện trong `.env.example:24-25`, `README.md:76-77`, và test expectation ở `internal/config/config_test.go:24-35`. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.
Validation:
- `go test ./internal/config -run CallbackBaseURL -v`
- `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- `go test ./...`
Derive CALLBACK_BASE_URL fallback from LISTEN_ADDR so default local setup resolves to localhost:8080 and stays aligned with server bind port.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
Non-blocking note:
defaultCallbackBaseURL still has an IPv6 edge case when LISTEN_ADDR is an IPv6 literal such as [::1]:8080; that path is not covered by tests today.
PASS
No blocking issues found in the latest update.
Validation:
- `go test ./internal/config -run CallbackBaseURL -v`
- `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- `go test ./...`
Non-blocking note:
- `defaultCallbackBaseURL` still has an IPv6 edge case when `LISTEN_ADDR` is an IPv6 literal such as `[::1]:8080`; that path is not covered by tests today.
codex
approved these changes 2026-04-27 21:04:42 +07:00
go test ./internal/ai_client -run UsesCallbackBaseURL -v
go test ./...
Non-blocking note:
defaultCallbackBaseURL still has an IPv6 edge case when LISTEN_ADDR is an IPv6 literal such as [::1]:8080; that path is not covered by tests today.
PASS
No blocking issues found in the latest update.
Validation:
- `go test ./internal/config -run CallbackBaseURL -v`
- `go test ./internal/ai_client -run UsesCallbackBaseURL -v`
- `go test ./...`
Non-blocking note:
- `defaultCallbackBaseURL` still has an IPv6 edge case when `LISTEN_ADDR` is an IPv6 literal such as `[::1]:8080`; that path is not covered by tests today.
thuanle
merged commit 0aa95915a2 into main2026-04-27 21:05:23 +07:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
CALLBACK_BASE_URLconfig and default it tohttp://localhostwhen unset.callback_urlfromCALLBACK_BASE_URLinstead ofLISTEN_ADDR..env.exampleand README config documentation.Test Plan
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...Notes
LISTEN_ADDRremains server bind address only.callback_urlis now deployment-friendly while still working locally by default.FAIL
CALLBACK_BASE_URLdefault vẫn tạo callback URL sai cho setup mặc định đang được document.internal/config/config.go:76-80default listener là:8080nhưng default callback base lại làhttp://localhost, vàinternal/ai_client/client.go:133-138sẽ build thànhhttp://localhost/callbackthay vìhttp://localhost:8080/callback. Mismatch này cũng xuất hiện trong.env.example:24-25,README.md:76-77, và test expectation ởinternal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.Validation:
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...FAIL
CALLBACK_BASE_URLdefault vẫn tạo callback URL sai cho setup mặc định đang được document.internal/config/config.go:76-80default listener là:8080nhưng default callback base lại làhttp://localhost, vàinternal/ai_client/client.go:133-138sẽ build thànhhttp://localhost/callbackthay vìhttp://localhost:8080/callback. Mismatch này cũng xuất hiện trong.env.example:24-25,README.md:76-77, và test expectation ởinternal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.Validation:
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...FAIL
CALLBACK_BASE_URLdefault vẫn tạo callback URL sai cho setup mặc định đang được document.internal/config/config.go:76-80default listener là:8080nhưng default callback base lại làhttp://localhost, vàinternal/ai_client/client.go:133-138sẽ build thànhhttp://localhost/callbackthay vìhttp://localhost:8080/callback. Mismatch này cũng xuất hiện trong.env.example:24-25,README.md:76-77, và test expectation ởinternal/config/config_test.go:24-35. Kết quả là local/default setup vẫn gửi callback về port 80 trong khi bridge thực tế listen ở 8080.Validation:
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...Update for review feedback
Đã xử lý item
[High]về mismatch default callback port.Changes applied
CALLBACK_BASE_URLfallback không còn hard-codehttp://localhost.CALLBACK_BASE_URLunset, fallback được suy ra từLISTEN_ADDR::8080->http://localhost:8080:9090->http://localhost:90900.0.0.0:<port>/::<port>->localhost:<port>.env.exampledefaultCALLBACK_BASE_URL=http://localhost:8080LISTEN_ADDR.Files
internal/config/config.gointernal/config/config_test.gointernal/ai_client/client.go.env.exampleREADME.mdVerification
go test ./internal/config -run CallbackBaseURL -v✅go test ./internal/ai_client -run UsesCallbackBaseURL -v✅go test ./...✅Commit pushed:
2168042.PASS
No blocking issues found in the latest update.
Validation:
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...Non-blocking note:
defaultCallbackBaseURLstill has an IPv6 edge case whenLISTEN_ADDRis an IPv6 literal such as[::1]:8080; that path is not covered by tests today.PASS
No blocking issues found in the latest update.
Validation:
go test ./internal/config -run CallbackBaseURL -vgo test ./internal/ai_client -run UsesCallbackBaseURL -vgo test ./...Non-blocking note:
defaultCallbackBaseURLstill has an IPv6 edge case whenLISTEN_ADDRis an IPv6 literal such as[::1]:8080; that path is not covered by tests today.