Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
8af2a8d
Enable foreign_keys pragma on SQLite native pool
ScriptSmith Apr 25, 2026
f81bb8c
Wire Postgres pool config (timeouts and ssl mode)
ScriptSmith Apr 25, 2026
84ee986
Attach ConnectInfo to axum service for client IP extraction
ScriptSmith Apr 25, 2026
9883bb3
Use safe prefix strip helper for Anthropic stream IDs
ScriptSmith Apr 25, 2026
c58d440
Use /health/live for liveness and /health/ready for readiness
ScriptSmith Apr 25, 2026
1b81cae
Tighten OAuth callback loopback check and strip duplicate code param
ScriptSmith Apr 25, 2026
932f17f
Pin OpenAPI info.version to CARGO_PKG_VERSION
ScriptSmith Apr 25, 2026
afc03c3
Stop swallowing cargo audit failures in CI scripts
ScriptSmith Apr 25, 2026
550e583
Reject empty JWT and proxy audience values at config load
ScriptSmith Apr 25, 2026
947fc5a
Disallow space character in model string validation
ScriptSmith Apr 25, 2026
cba1be4
Return first routing error rather than last on fallback failure
ScriptSmith Apr 25, 2026
e3b394a
Match HADRIAN_TEST_DEBUG on value not env presence
ScriptSmith Apr 25, 2026
e2e13b1
Validate SAML metadata URL against SSRF in parse endpoint
ScriptSmith Apr 25, 2026
20a676f
Validate image URL against SSRF before fetching
ScriptSmith Apr 25, 2026
6c07a76
Strip reserved underscore-prefixed roles from bearer and proxy auth
ScriptSmith Apr 25, 2026
9c34a1b
Hide cross-user session existence in delete endpoint
ScriptSmith Apr 25, 2026
b63092f
Send Vertex API key via header instead of URL query
ScriptSmith Apr 25, 2026
47a3d0a
Use VecDeque for SSE stream output buffers to avoid O(n) shifts
ScriptSmith Apr 25, 2026
28c8664
Use parking_lot RwLock in CircuitBreakerRegistry to drop poison panic
ScriptSmith Apr 25, 2026
ab947cc
Add noopener to OpenRouter OAuth iframe escape window.open
ScriptSmith Apr 25, 2026
9f6305a
Reject protocol-relative return_to values on login redirect
ScriptSmith Apr 25, 2026
3ba6e8d
Redact auth token from AccountPage data export
ScriptSmith Apr 25, 2026
c3f47e0
Clamp ListQuery limit to a hard maximum of 1000
ScriptSmith Apr 25, 2026
fbf0c47
Sanitize CSV export cells to defang formula injection
ScriptSmith Apr 25, 2026
0708ea4
Route citation links through parent URL handler for safety modal
ScriptSmith Apr 25, 2026
2a2edce
Default audit log list to last 7 days when no range given
ScriptSmith Apr 25, 2026
9cf736b
Validate DLQ table_name as identifier before interpolating
ScriptSmith Apr 25, 2026
0d175c3
Mark selected conversation with aria-current for screen readers
ScriptSmith Apr 25, 2026
beb5894
Log SSE event parse errors instead of silently swallowing
ScriptSmith Apr 25, 2026
4cdb3b8
Wrap clipboard writes in try/catch to surface failures
ScriptSmith Apr 25, 2026
92bc583
Debounce and memoise conversation list filter to avoid O(N*M) hitches
ScriptSmith Apr 25, 2026
786ac9e
Stop forcing inflated virtualizer height in ChatMessageList
ScriptSmith Apr 25, 2026
9bdb3db
Broadcast post-update conversation snapshot to other tabs
ScriptSmith Apr 25, 2026
88de4db
Compare feedback historyMode and modeMetadata in memo equality
ScriptSmith Apr 25, 2026
e2b5593
Apply nightly rustfmt to review-fixes changes
ScriptSmith Apr 25, 2026
f2edc67
Reject session cookie secure=false with SameSite=None
ScriptSmith Apr 25, 2026
899b3fe
Preserve SSE event terminator when injecting cost
ScriptSmith Apr 25, 2026
d3af79f
Estimate SSE delta tokens by char count, not byte len
ScriptSmith Apr 25, 2026
4850102
Pin React Query mutations retry to 0
ScriptSmith Apr 25, 2026
140c5c1
Use form's isSubmitting on LoginPage to prevent double-submit
ScriptSmith Apr 25, 2026
aeb5aa8
Make OIDC/SAML auth_state TTL configurable via SessionConfig
ScriptSmith Apr 25, 2026
2dcd808
Only strip Content-Length when cost injection rewrites body
ScriptSmith Apr 25, 2026
443c85a
Surface unknown OAuth owner kind instead of coercing to user
ScriptSmith Apr 25, 2026
7212f40
Cancel useAutoScroll rAF on unmount to avoid stale scheduled callback
ScriptSmith Apr 25, 2026
128ccf3
Roll back optimistic pin reorder on sync failure
ScriptSmith Apr 25, 2026
55fc3e5
Cache shiki HTML so theme toggles reuse prior highlights
ScriptSmith Apr 25, 2026
4e82ec0
Replace 50-char prefix sync hash with djb2 over full content
ScriptSmith Apr 25, 2026
c5c45db
Accept pasted images in ChatInput textarea
ScriptSmith Apr 25, 2026
d5c9592
Broadcast useLocalStorage writes to same-tab hook instances
ScriptSmith Apr 25, 2026
0a74231
SSRF-validate per-org OIDC redirect_uri on create and update
ScriptSmith Apr 25, 2026
33991a9
Abort in-flight title generation when ConversationsProvider unmounts
ScriptSmith Apr 25, 2026
5de4df6
Scope API-key revoke/rotate authz by owner org/team/project
ScriptSmith Apr 25, 2026
3136d84
Gate admin-UI bypass on explicit VITE_FORCE_ADMIN_ACCESS env flag
ScriptSmith Apr 25, 2026
dfc9e4e
Cancel superseded CEL validation requests with AbortController
ScriptSmith Apr 25, 2026
30316b9
Skip HTTPS image preprocessing for providers that pass through
ScriptSmith Apr 25, 2026
1c848d3
Wire DataTable filtered row model unconditionally
ScriptSmith Apr 25, 2026
18bd86d
Prefer configured public_url for SCIM base URL
ScriptSmith Apr 25, 2026
b302de8
Replace per-token Markdown pre-tagging with MutationObserver
ScriptSmith Apr 25, 2026
670f439
Generate a session secret in wizard-rendered IdP configs
ScriptSmith Apr 25, 2026
38103eb
Validate branding colors, fonts, and favicon URL before injecting
ScriptSmith Apr 25, 2026
57690a9
Record cache_operation error metric on semantic-match lookup failure
ScriptSmith Apr 25, 2026
28dd9fe
Drop inner stream when IdleTimeoutStream times out to release upstrea…
ScriptSmith Apr 25, 2026
9541f35
Skip primary payload clone when no fallback chain is configured
ScriptSmith Apr 25, 2026
1443a82
Strip provider error detail from client responses; keep raw text in logs
ScriptSmith Apr 25, 2026
24ba57c
Move shutdown timeouts and JWT loader concurrency to ServerConfig
ScriptSmith Apr 25, 2026
0b51c20
Bound AWS credential-refresh notify_waiters wait to avoid stuck waiters
ScriptSmith Apr 25, 2026
99f56b6
Drain provider stream transformers in a loop instead of self-waking
ScriptSmith Apr 25, 2026
51a5c2d
Probe /auth/me for header auth so non-admin users authenticate cleanly
ScriptSmith Apr 25, 2026
691651f
Confine FilesystemFileStorage I/O to the configured root via canonica…
ScriptSmith Apr 25, 2026
26418a9
Pin audit-log list org_id to caller's org membership
ScriptSmith Apr 25, 2026
38cf600
Pass requested owner scope into skills/templates create authz check
ScriptSmith Apr 25, 2026
aa0838e
Delete orphaned files from external storage before removing DB rows
ScriptSmith Apr 25, 2026
37a1229
Walk caller's memberships in user_has_access instead of paging throug…
ScriptSmith Apr 25, 2026
f85e43c
Bound Kreuzberg document extraction with configurable timeout
ScriptSmith Apr 25, 2026
c93e84f
Use partial unique index so soft-deleted vector_store_files don't blo…
ScriptSmith Apr 25, 2026
e429cc7
Surface UUID parse errors in service_accounts revoke instead of dropp…
ScriptSmith Apr 25, 2026
617417e
Combine DLQ count and delete into a single statement to fix TOCTOU
ScriptSmith Apr 25, 2026
ef8e891
Route MCPUIRenderer default link clicks through trusted-domain modal
ScriptSmith Apr 25, 2026
ff94277
Accept optional zod schema in useLocalStorage to validate cross-tab w…
ScriptSmith Apr 25, 2026
f31b16c
Replace per-token streaming aria-live with hidden status region annou…
ScriptSmith Apr 25, 2026
5676cba
Add hidden streaming status region to MultiModelResponse for screen r…
ScriptSmith Apr 25, 2026
7e17dab
Spawn static models cache warm after listener bind so it doesn't bloc…
ScriptSmith Apr 25, 2026
4c6974a
Reject empty error.message and error.type in assert_error helper
ScriptSmith Apr 25, 2026
ff0bb8a
Panic with raw body when provider e2e response isn't valid JSON
ScriptSmith Apr 25, 2026
fe5b84f
Add SSRF validation and issuer pinning to OIDC discovery
ScriptSmith Apr 25, 2026
463efa6
Strip reserved-prefix roles from OIDC and SAML session claims
ScriptSmith Apr 25, 2026
5e68979
Honor real OAuth token expiry in Vertex token caching
ScriptSmith Apr 25, 2026
ab5a8b0
Drop bespoke IPv4/IPv6 form validators; rely on backend IpNet parser
ScriptSmith Apr 25, 2026
7d3b258
Make Anthropic interleaved-thinking model allowlist configurable
ScriptSmith Apr 25, 2026
b1571bf
Re-scope DLQ retry authz to the queued entry's tenant fields
ScriptSmith Apr 25, 2026
9a9bdf0
Cap accumulated reasoning and text content in stream state
ScriptSmith Apr 25, 2026
0b5a7a5
Pin Dockerfile builder to stable Rust 1.90 and set MSRV
ScriptSmith Apr 25, 2026
b68cf62
Replace startup unwrap/expect with structured exit and bump MSRV to 1.91
ScriptSmith Apr 25, 2026
927b58f
Fail closed when IAP is configured without trusted_proxies
ScriptSmith Apr 25, 2026
bad30cc
Log a startup error when ignored TLS config is present
ScriptSmith Apr 25, 2026
24cd6ae
Regenerate Hadrian OpenAPI spec in CI before conformance check
ScriptSmith Apr 25, 2026
c02234a
Set terminationGracePeriodSeconds=60 in Helm to fit 35s drain
ScriptSmith Apr 25, 2026
76536c1
Validate chat completion content, usage, and model echo in shared test
ScriptSmith Apr 25, 2026
e4eec25
Throttle bootstrap admin auth per IP to deter key guessing
ScriptSmith Apr 26, 2026
8060b86
Throttle /auth/discover separately to deter SSO domain enumeration
ScriptSmith Apr 26, 2026
77d1c1b
Make DLQ pop atomic via DELETE...RETURNING with row locking
ScriptSmith Apr 26, 2026
1417e83
Bind RFC-3339 timestamps in SQLite repos and grep-guard regressions
ScriptSmith Apr 26, 2026
f6b499e
Scope response/semantic cache keys and vector search by tenant
ScriptSmith Apr 26, 2026
4c65e17
Burn OAuth code after repeated PKCE verifier failures
ScriptSmith Apr 26, 2026
b406a3e
Pepper SCIM bearer token hashes with HMAC-SHA256
ScriptSmith Apr 26, 2026
2e919b0
Drop unused daily_spend table and its retention plumbing
ScriptSmith Apr 26, 2026
d2ccba9
Sandbox HTML artifact open-in-new-tab in unique-origin iframe
ScriptSmith Apr 26, 2026
ee921ab
Add bash-style ${VAR:-default} fallback syntax for env-var expansion
ScriptSmith Apr 26, 2026
69aa1c9
Stack modal focus traps and inert background under stacked dialogs
ScriptSmith Apr 26, 2026
dd94297
Centralize error toast formatting via formatApiError helper
ScriptSmith Apr 26, 2026
b422c1e
Scope admin authz to row owner instead of all-None tuples
ScriptSmith Apr 26, 2026
2c47aa1
Delegate SPA OIDC logout to backend instead of fragile URL rewrite
ScriptSmith Apr 26, 2026
f4c9ef2
Add integration tests covering the OAuth PKCE redeem path
ScriptSmith Apr 26, 2026
c886152
Namespace inline-edit keys to avoid chat/multi-model collision
ScriptSmith Apr 26, 2026
fb6b4e2
Wrap chat tree in ErrorBoundary for recoverable render-time crashes
ScriptSmith Apr 26, 2026
202ee92
Replace ad-hoc SSE line split with spec-compliant SseParser
ScriptSmith Apr 26, 2026
072bb79
Tighten service-worker bootstrap to avoid races and stranger SWs
ScriptSmith Apr 26, 2026
73b040d
Cache matchSkills result so slash popover does one scan per keystroke
ScriptSmith Apr 26, 2026
42a25ed
Stop dropdown mouseenter from stealing focus during keyboard nav
ScriptSmith Apr 26, 2026
d7b8854
Stop useChat from subscribing to entire streaming/debug stores
ScriptSmith Apr 26, 2026
149f5f1
Abort streams and epoch-tag commits on conversation switch
ScriptSmith Apr 26, 2026
2c60e8d
Stop retrying body errors so we don't double-bill on partial uploads
ScriptSmith Apr 26, 2026
9ff6a28
Dedupe fallback chain, cap length, and re-check CB per hop
ScriptSmith Apr 26, 2026
f66f642
Drain usage logs through bounded channel instead of spawning from Drop
ScriptSmith Apr 26, 2026
794436e
Default CSP to strict preset; opt into permissive for WASM features
ScriptSmith Apr 26, 2026
c14c813
Per-route body limits for audio transcription and file uploads
ScriptSmith Apr 26, 2026
4ed7797
Lazy-load KaTeX CSS so it stays out of the initial bundle
ScriptSmith Apr 26, 2026
e1fb680
Make OTEL trace test actually verify gateway spans reach Jaeger
ScriptSmith Apr 26, 2026
a9d9edf
Type recharts tooltip payloads instead of disabling no-explicit-any
ScriptSmith Apr 26, 2026
b1e8a0e
Honor standard OTEL env vars so Helm-set OTLP endpoint actually exports
ScriptSmith Apr 26, 2026
a652af2
Add hadrian healthcheck subcommand and drop curl from Docker image
ScriptSmith Apr 26, 2026
a55ecef
Make CommandPalette announce as a combobox with active-descendant lis…
ScriptSmith Apr 26, 2026
228f7da
Add 24h TTL to API-key auth stored in localStorage
ScriptSmith Apr 26, 2026
11ea583
Use Postgres advisory lock so cleanup workers run on one replica per …
ScriptSmith Apr 26, 2026
5441c82
Skip deserialize round-trip in ConversationsProvider setConversations
ScriptSmith Apr 26, 2026
7011ff7
Add per-IP rate limit and LRU eviction to GatewayJwtRegistry lazy-load
ScriptSmith Apr 26, 2026
e61ed36
Add pytest tests for openapi-conformance script resolver and checker
ScriptSmith Apr 26, 2026
2e5b26d
Use aggregate count queries in access-review summary instead of per-u…
ScriptSmith Apr 26, 2026
b1bb070
Switch samael from git pin to crates.io 0.0.20 and deny unknown-git
ScriptSmith Apr 26, 2026
74fe696
Lazy-load vega-embed so chart runtime is split out of main bundle
ScriptSmith Apr 26, 2026
faa47cd
Add SR-only table and aria-label to recharts wrappers and SimpleBarChart
ScriptSmith Apr 26, 2026
45cf3ae
Reassemble streaming deltas and assert non-empty content in provider …
ScriptSmith Apr 26, 2026
c6094bd
Exercise Hadrian DLQ admin endpoints instead of redis-cli stream comm…
ScriptSmith Apr 26, 2026
e766d26
Make admin-api-crud tests order-independent via beforeAll and scratch…
ScriptSmith Apr 26, 2026
c3530ac
Add opt-in urlStateKey to DataTable for deep-linkable filter and pagi…
ScriptSmith Apr 26, 2026
243a758
Add OpenAPI annotations for /auth/me and /auth/discover
ScriptSmith Apr 26, 2026
06871ac
Add ChatPage smoke story with mocked providers and msw handlers
ScriptSmith Apr 26, 2026
28d3b59
Pre-fetch owner scope for /api-keys/:id/usage and /users/:id/usage authz
ScriptSmith Apr 26, 2026
94b272b
Pin reqwest DNS to validated SSRF addrs and stream image body cutoff
ScriptSmith Apr 26, 2026
2ba9255
Refuse startup when [server.tls] is set without acknowledge_unsupported
ScriptSmith Apr 26, 2026
4e21330
Explicitly pg_advisory_unlock LeaderGuard on Drop with detach fallback
ScriptSmith Apr 26, 2026
87c3da7
Gate api-key revoke/rotate NotFound behind unscoped authz to close or…
ScriptSmith Apr 26, 2026
bedb859
Make SCIM token pepper mandatory and require [auth.session].secret
ScriptSmith Apr 26, 2026
eca0c17
Arm AWS credential refresh notified() before CAS to avoid missed-wakeup
ScriptSmith Apr 26, 2026
98cd0ce
Add interleaved_thinking_models allowlist to Bedrock provider
ScriptSmith Apr 26, 2026
cc8bfb8
Pin audit-log list to caller's single org membership
ScriptSmith Apr 26, 2026
7fa53a3
Move list limit clamp into ListParams::clamp on construction
ScriptSmith Apr 26, 2026
5c1ddc6
Tenant-scope DLQ get/delete/retry via entry_authz_scope helper
ScriptSmith Apr 26, 2026
a0d87ca
Coalesce useStreamingStore appendContent into one setState per rAF
ScriptSmith Apr 26, 2026
816b855
Defer lone trailing CR in SseParser to handle CRLF split across chunks
ScriptSmith Apr 26, 2026
88e8cdd
Use OsRng directly for wizard-generated session secret
ScriptSmith Apr 26, 2026
ec30121
Drop rust-version pin and bump Dockerfile to rust:1.95.0-slim
ScriptSmith Apr 26, 2026
1ed3770
Fix formatting
ScriptSmith Apr 26, 2026
710c41c
Fix build
ScriptSmith Apr 26, 2026
cef16e0
Fix bug with initial conversation
ScriptSmith Apr 26, 2026
45dc3cd
Review fixes
ScriptSmith Apr 26, 2026
82af8df
Build fixes
ScriptSmith Apr 27, 2026
abe9982
Fix unit tests
ScriptSmith Apr 27, 2026
e23242c
Fix e2e tests
ScriptSmith Apr 27, 2026
fefb923
Fix chart
ScriptSmith Apr 28, 2026
1c2a534
Address tar vuln
ScriptSmith Apr 28, 2026
2684a8e
Fix WebSocket race condition
ScriptSmith Apr 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -427,9 +427,33 @@ jobs:
- name: Install uv
uses: astral-sh/setup-uv@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry & target
uses: Swatinem/rust-cache@v2

- name: Install build deps for samael
run: |
sudo apt-get update
sudo apt-get install -y libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config libssl-dev

- name: Regenerate Hadrian OpenAPI spec
run: cargo run --release -- openapi --output openapi/hadrian.openapi.json

- name: Verify checked-in spec matches generated
run: |
if ! git diff --exit-code -- openapi/hadrian.openapi.json; then
echo "::error::openapi/hadrian.openapi.json is out of date. Run ./scripts/generate-openapi.sh and commit the result." >&2
exit 1
fi

- name: Fetch reference specs
run: ./scripts/fetch-openapi-specs.sh openai

- name: Test conformance script
run: ./scripts/test_openapi_conformance.py

- name: Run conformance check
run: ./scripts/openapi-conformance.py

Expand Down
18 changes: 17 additions & 1 deletion .github/workflows/helm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,17 @@ jobs:
cluster_name: helm-test
wait: 120s

# `helm/kind-action`'s `wait` only waits for the control plane to be
# Ready. CoreDNS / kube-proxy can still be coming up at that point, and
# kicking off `helm install` against a half-warm API server has shown up
# as `client rate limiter Wait returned an error: context deadline
# exceeded` — helm's discovery calls saturate client-go's QPS budget
# while the apiserver is sluggish, then time out.
- name: Wait for cluster system pods
run: |
kubectl wait --for=condition=Ready pods --all -n kube-system --timeout=180s
kubectl get pods -A

- name: Add Bitnami repo
run: helm repo add bitnami https://charts.bitnami.com/bitnami

Expand Down Expand Up @@ -368,10 +379,15 @@ jobs:

- name: Install chart
run: |
# `--burst-limit` raises client-go's burst from the default 100; the
# kind apiserver in CI is slow enough that helm's discovery + readiness
# polling can otherwise hit the limiter and fail with
# `client rate limiter Wait returned an error: context deadline exceeded`.
helm install hadrian helm/hadrian \
-f /tmp/kind-test-values.yaml \
--wait \
--timeout 5m
--timeout 5m \
--burst-limit 300

- name: Check deployment status
run: |
Expand Down
104 changes: 16 additions & 88 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ rust_decimal = { version = "1.40.0", features = ["macros"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
sha2 = "0.10"
hmac = "0.12"
subtle = "2.6.1"
thiserror = "2.0.17"
tokio = { version = "1.48.0", features = [
Expand Down Expand Up @@ -356,7 +357,7 @@ metrics-exporter-prometheus = { version = "0.16", optional = true }
open = { version = "5.3.3", optional = true }
openssl = { version = "0.10", optional = true }
opentelemetry = { version = "0.31", optional = true }
opentelemetry-otlp = { version = "0.31", features = ["trace", "logs", "grpc-tonic", "http-proto"], optional = true }
opentelemetry-otlp = { version = "0.31", features = ["trace", "logs", "grpc-tonic", "gzip-tonic", "http-proto"], optional = true }
opentelemetry-semantic-conventions = { version = "0.31", optional = true }
opentelemetry_sdk = { version = "0.31", features = ["rt-tokio", "logs"], optional = true }
redis = { version = "0.32.7", features = ["aio", "tokio-comp", "cluster-async"], optional = true }
Expand Down
Loading
Loading