Release v0.1.7 - arcgolabs/vale GitHub Wiki
Vale v0.1.7
Vale v0.1.7 upgrades the complete workspace to Go 1.27.1 and refreshes all direct dependencies. It also introduces first-class in-process handlers and safe defaults for long-lived server-sent event streams.
Upgrade
All modules in this repository declare Go 1.27.1. Local development is
workspace-first: sibling modules are resolved by go.work, rather than by
adding repository-local require or replace entries to their go.mod files.
go version
go work sync
go test ./...
Consumers can update the root library with:
go get github.com/arcgolabs/[email protected]
go mod tidy
Optional modules use their own path-prefixed tags, matching the module path.
In-process HTTP handlers
Use NewHandlerEndpoint when a route is backed by an http.Handler in the
current process:
endpoint, err := vale.NewHandlerEndpoint(
"static-capabilities",
1,
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "application/json")
_, _ = io.WriteString(w, `{"status":"ready"}`)
}),
)
if err != nil {
return err
}
service := vale.NewService("capabilities", "round_robin", endpoint)
route := vale.NewRoute("capabilities", "web", service).
WithPathPrefix("/capabilities")
A handler-backed endpoint:
- does not require a synthetic upstream URL;
- is excluded from HTTP upstream health probes;
- remains selectable independently of proxied upstream health; and
- has a stable name for admin views, metrics, access logs, catalog entries, and runtime diffs.
This means a failing model upstream can return 503 while an independent
static capability route continues to return its deterministic in-process
response immediately.
Use NewEndpoint for an actual proxied HTTP upstream and provide its real URL.
Long-lived SSE routes
Responses with Content-Type: text/event-stream are stream-safe by default:
- the active write deadline is cleared after the response is identified as an event stream;
- gzip and
min_bytescompression buffering are bypassed; http.Flusherremains available through the middleware stack; and- client disconnect cancellation propagates to the upstream request context.
For code-first configuration, disable the write timeout on a dedicated SSE route:
events := vale.NewRoute("events", "web", service).
WithPathPrefix("/events").
WithWriteTimeout(0)
For HCL configuration:
route "events" {
entrypoint = "web"
service = "model"
path_prefix = "/events"
write_timeout = "0s"
}
The route timeout has three states:
- omitted: inherit the global security write timeout;
0: disable the write timeout for that route; and- positive duration: override the global timeout for that route.
Invalid or negative durations are rejected during configuration validation.
Windows build without MSYS2
valed does not require CGO. A native Windows binary can be built without
MSYS2 or a C compiler:
$env:CGO_ENABLED = "0"
go build -C cmd -trimpath -o valed.exe .
Use a temporary output directory outside the source tree for release artifacts when desired.
Build and publish the container locally
Release images are built from the tagged source tree on the release operator's machine and pushed with Docker Buildx. Authenticate to GHCR first, then run:
docker buildx build --platform linux/amd64,linux/arm64 --push \
--build-arg VERSION=v0.1.7 \
--build-arg COMMIT="$(git rev-parse --short=12 'v0.1.7^{}')" \
--build-arg DATE="$(git show -s --format=%cI 'v0.1.7^{}')" \
-t ghcr.io/arcgolabs/vale:v0.1.7 \
-t ghcr.io/arcgolabs/vale:0.1.7 \
-t ghcr.io/arcgolabs/vale:latest .
The image build is CGO-free and uses Go 1.27.1. Verify the published manifests:
docker buildx imagetools inspect ghcr.io/arcgolabs/vale:v0.1.7
Additional modernization
- Public extension registries now provide generic, type-safe APIs.
- Operational gateway and TCP proxy logs use injected loggers.
- CI actions and golangci-lint were updated for Go 1.27.1.
- Direct dependencies were refreshed while preserving upstream compatibility constraints for transitive dependencies.
See the repository CHANGELOG for the concise release history.