Skip to content

feat: support multi-header custom auth#53

Merged
matthiastjong merged 1 commit intomatthiastjong:mainfrom
steve-wecompare:feat/multi-header-auth
Apr 9, 2026
Merged

feat: support multi-header custom auth#53
matthiastjong merged 1 commit intomatthiastjong:mainfrom
steve-wecompare:feat/multi-header-auth

Conversation

@steve-wecompare
Copy link
Copy Markdown
Contributor

Summary

  • add multi-header support to custom_header auth while keeping legacy single-header credentials working
  • update the target auth UI/server actions to collect and store multiple header name/value pairs as JSON
  • add tests for JSON multi-header injection and custom_header credential hints

Verification

shellgate@0.0.1 check
svelte-kit sync && svelte-check --tsconfig ./tsconfig.json

Loading svelte-check in workspace: /private/tmp/shellgate
Getting Svelte diagnostics...

/private/tmp/shellgate/src/lib/components/connect-agent-flow.svelte:31:41
Warn: This reference only captures the initial value of targets. Did you mean to reference it inside a derived instead?
https://svelte.dev/e/state_referenced_locally (svelte)
// Local target list (updated inline when step 3 creates one)
let localTargets = $state<Target[]>([...targets]);

====================================
svelte-check found 0 errors and 1 warning in 1 file ✅

shellgate@0.0.1 build
vite build

vite v7.3.1 building ssr environment for production...
transforming...
✓ 1203 modules transformed.
rendering chunks...
vite v7.3.1 building client environment for production...
transforming...
✓ 1152 modules transformed.
rendering chunks...
computing gzip size...
.svelte-kit/output/client/_app/version.json 0.03 kB │ gzip: 0.05 kB
.svelte-kit/output/client/.vite/manifest.json 17.38 kB │ gzip: 2.00 kB
.svelte-kit/output/client/_app/immutable/assets/0.DibthrN1.css 88.31 kB │ gzip: 15.16 kB
.svelte-kit/output/client/_app/immutable/entry/start.CUdjYSdg.js 0.08 kB │ gzip: 0.09 kB
.svelte-kit/output/client/_app/immutable/chunks/CV0rJQKK.js 0.18 kB │ gzip: 0.14 kB
.svelte-kit/output/client/_app/immutable/chunks/x2McBsM4.js 0.37 kB │ gzip: 0.26 kB
.svelte-kit/output/client/_app/immutable/chunks/BwUXKKkD.js 0.41 kB │ gzip: 0.31 kB
.svelte-kit/output/client/_app/immutable/chunks/ClQBHgGK.js 0.47 kB │ gzip: 0.33 kB
.svelte-kit/output/client/_app/immutable/chunks/ofZ-mgWB.js 0.54 kB │ gzip: 0.39 kB
.svelte-kit/output/client/_app/immutable/chunks/D0D7Xt5f.js 0.56 kB │ gzip: 0.38 kB
.svelte-kit/output/client/_app/immutable/chunks/BziWcyk6.js 0.56 kB │ gzip: 0.39 kB
.svelte-kit/output/client/_app/immutable/chunks/COAZihoL.js 0.63 kB │ gzip: 0.38 kB
.svelte-kit/output/client/_app/immutable/chunks/pcFKo-oU.js 0.63 kB │ gzip: 0.44 kB
.svelte-kit/output/client/_app/immutable/chunks/BBx_zhSA.js 0.66 kB │ gzip: 0.40 kB
.svelte-kit/output/client/_app/immutable/chunks/DeljZ7ox.js 0.67 kB │ gzip: 0.44 kB
.svelte-kit/output/client/_app/immutable/chunks/BHbJTFDA.js 0.79 kB │ gzip: 0.39 kB
.svelte-kit/output/client/_app/immutable/chunks/BUA263xz.js 0.94 kB │ gzip: 0.56 kB
.svelte-kit/output/client/_app/immutable/nodes/12.CuwBbAlM.js 1.00 kB │ gzip: 0.57 kB
.svelte-kit/output/client/_app/immutable/nodes/6.BdRJQE7r.js 1.34 kB │ gzip: 0.69 kB
.svelte-kit/output/client/_app/immutable/chunks/tAiWj5CH.js 1.38 kB │ gzip: 0.75 kB
.svelte-kit/output/client/_app/immutable/nodes/1.Bd4oL9Qj.js 1.46 kB │ gzip: 0.80 kB
.svelte-kit/output/client/_app/immutable/chunks/DJSWIrlD.js 1.54 kB │ gzip: 0.77 kB
.svelte-kit/output/client/_app/immutable/chunks/DUHcUqf5.js 1.67 kB │ gzip: 0.57 kB
.svelte-kit/output/client/_app/immutable/chunks/YSZjIP4b.js 1.70 kB │ gzip: 0.95 kB
.svelte-kit/output/client/_app/immutable/chunks/TloLV0EA.js 1.77 kB │ gzip: 0.93 kB
.svelte-kit/output/client/_app/immutable/chunks/CBfQKI_d.js 2.01 kB │ gzip: 1.00 kB
.svelte-kit/output/client/_app/immutable/chunks/BdAYMcRV.js 2.48 kB │ gzip: 0.78 kB
.svelte-kit/output/client/_app/immutable/nodes/11.YVWXfRq9.js 2.63 kB │ gzip: 1.19 kB
.svelte-kit/output/client/_app/immutable/chunks/CEZfJasm.js 2.72 kB │ gzip: 1.13 kB
.svelte-kit/output/client/_app/immutable/chunks/mUfJ0U9e.js 2.93 kB │ gzip: 1.02 kB
.svelte-kit/output/client/_app/immutable/nodes/13.CqjIrtn7.js 3.01 kB │ gzip: 1.25 kB
.svelte-kit/output/client/_app/immutable/chunks/DkEOo4Ip.js 3.15 kB │ gzip: 1.23 kB
.svelte-kit/output/client/_app/immutable/chunks/DYtTYEiS.js 3.16 kB │ gzip: 1.17 kB
.svelte-kit/output/client/_app/immutable/chunks/BNokb9XM.js 3.66 kB │ gzip: 1.38 kB
.svelte-kit/output/client/_app/immutable/chunks/D-nqHc56.js 4.09 kB │ gzip: 1.42 kB
.svelte-kit/output/client/_app/immutable/chunks/BHeU8ZUj.js 4.49 kB │ gzip: 1.98 kB
.svelte-kit/output/client/_app/immutable/chunks/BaMjTeUV.js 5.41 kB │ gzip: 2.04 kB
.svelte-kit/output/client/_app/immutable/nodes/8.BPlMqoI4.js 5.88 kB │ gzip: 2.30 kB
.svelte-kit/output/client/_app/immutable/chunks/CjcPfdJR.js 8.15 kB │ gzip: 3.26 kB
.svelte-kit/output/client/_app/immutable/chunks/CyI3B4fV.js 8.65 kB │ gzip: 3.07 kB
.svelte-kit/output/client/_app/immutable/entry/app.DSVwMW4j.js 8.76 kB │ gzip: 3.43 kB
.svelte-kit/output/client/_app/immutable/nodes/5.BuTj18rk.js 9.15 kB │ gzip: 3.32 kB
.svelte-kit/output/client/_app/immutable/chunks/CCaQfGNC.js 11.42 kB │ gzip: 5.12 kB
.svelte-kit/output/client/_app/immutable/nodes/7.Dm-Tk61f.js 13.46 kB │ gzip: 4.44 kB
.svelte-kit/output/client/_app/immutable/nodes/3.DB1MLK3x.js 13.76 kB │ gzip: 3.94 kB
.svelte-kit/output/client/_app/immutable/chunks/1v62jRTu.js 18.18 kB │ gzip: 5.50 kB
.svelte-kit/output/client/_app/immutable/nodes/4.Bh3LypTb.js 20.71 kB │ gzip: 6.63 kB
.svelte-kit/output/client/_app/immutable/nodes/2.CFlbUu8x.js 20.85 kB │ gzip: 6.27 kB
.svelte-kit/output/client/_app/immutable/chunks/Ccux_hrO.js 23.43 kB │ gzip: 6.81 kB
.svelte-kit/output/client/_app/immutable/nodes/9.CXRwkhGA.js 30.95 kB │ gzip: 8.41 kB
.svelte-kit/output/client/_app/immutable/chunks/CpeRGzB8.js 33.00 kB │ gzip: 12.82 kB
.svelte-kit/output/client/_app/immutable/chunks/av0Rauib.js 34.87 kB │ gzip: 13.48 kB
.svelte-kit/output/client/_app/immutable/nodes/0.DTdgIhc-.js 35.33 kB │ gzip: 12.74 kB
.svelte-kit/output/client/_app/immutable/chunks/DRLthEu1.js 36.59 kB │ gzip: 12.29 kB
.svelte-kit/output/client/_app/immutable/chunks/Dt1CkOdt.js 48.33 kB │ gzip: 14.84 kB
.svelte-kit/output/client/_app/immutable/chunks/Cl40o2JW.js 53.77 kB │ gzip: 15.96 kB
.svelte-kit/output/client/_app/immutable/nodes/10.DcACatbi.js 60.05 kB │ gzip: 14.07 kB
✓ built in 1.85s
.svelte-kit/output/server/.vite/manifest.json 28.49 kB
.svelte-kit/output/server/_app/immutable/assets/_layout.BQh5VdIK.css 88.29 kB
.svelte-kit/output/server/chunks/false.js 0.04 kB
.svelte-kit/output/server/entries/pages/_layout.ts.js 0.08 kB
.svelte-kit/output/server/entries/pages/(app)/_layout.server.ts.js 0.09 kB
.svelte-kit/output/server/chunks/validate.js 0.11 kB
.svelte-kit/output/server/entries/endpoints/api/health/_server.ts.js 0.14 kB
.svelte-kit/output/server/chunks/shared-server.js 0.28 kB
.svelte-kit/output/server/chunks/db-error.js 0.30 kB
.svelte-kit/output/server/chunks/ip.js 0.33 kB
.svelte-kit/output/server/chunks/index-server.js 0.34 kB
.svelte-kit/output/server/entries/pages/logout/_page.server.ts.js 0.34 kB
.svelte-kit/output/server/chunks/index5.js 0.37 kB
.svelte-kit/output/server/internal.js 0.41 kB
.svelte-kit/output/server/entries/endpoints/api/targets/by-slug/slug/_server.ts.js 0.42 kB
.svelte-kit/output/server/entries/endpoints/health/_server.ts.js 0.45 kB
.svelte-kit/output/server/chunks/state.svelte.js 0.45 kB
.svelte-kit/output/server/entries/pages/(app)/connect/_page.server.ts.js 0.46 kB
.svelte-kit/output/server/chunks/cache.js 0.53 kB
.svelte-kit/output/server/entries/endpoints/api/install/hermes/_server.ts.js 0.56 kB
.svelte-kit/output/server/entries/endpoints/api/install/openclaw/_server.ts.js 0.56 kB
.svelte-kit/output/server/entries/endpoints/api/install/claude-code/_server.ts.js 0.57 kB
.svelte-kit/output/server/entries/pages/(app)/settings/_page.server.ts.js 0.57 kB
.svelte-kit/output/server/entries/endpoints/api/tokens/id/regenerate/_server.ts.js 0.59 kB
.svelte-kit/output/server/chunks/environment.js 0.62 kB
.svelte-kit/output/server/entries/endpoints/api/tokens/id/permissions/targetId/_server.ts.js 0.67 kB
.svelte-kit/output/server/chunks/dialog-footer.js 0.68 kB
.svelte-kit/output/server/chunks/client.js 0.68 kB
.svelte-kit/output/server/entries/pages/(auth)/onboarding/_page.server.ts.js 0.71 kB
.svelte-kit/output/server/entries/endpoints/verify-connection/_server.ts.js 0.77 kB
.svelte-kit/output/server/entries/endpoints/api/tokens/_server.ts.js 0.79 kB
.svelte-kit/output/server/entries/pages/(auth)/login/_page.server.ts.js 0.83 kB
.svelte-kit/output/server/chunks/migrate.js 1.00 kB
.svelte-kit/output/server/chunks/auth.js 1.00 kB
.svelte-kit/output/server/entries/endpoints/api/targets/_server.ts.js 1.06 kB
.svelte-kit/output/server/chunks/api-auth.js 1.07 kB
.svelte-kit/output/server/entries/endpoints/discovery/_server.ts.js 1.09 kB
.svelte-kit/output/server/entries/endpoints/api/tokens/id/_server.ts.js 1.09 kB
.svelte-kit/output/server/chunks/utils.js 1.15 kB
.svelte-kit/output/server/entries/endpoints/api/audit-logs/_server.ts.js 1.18 kB
.svelte-kit/output/server/entries/pages/(auth)/onboarding/_page.svelte.js 1.21 kB
.svelte-kit/output/server/chunks/hidden-input.js 1.22 kB
.svelte-kit/output/server/entries/endpoints/api/tokens/id/permissions/_server.ts.js 1.23 kB
.svelte-kit/output/server/entries/endpoints/api/targets/slug/auth-methods/_server.ts.js 1.24 kB
.svelte-kit/output/server/entries/pages/(app)/logs/_page.server.ts.js 1.39 kB
.svelte-kit/output/server/chunks/index.js 1.44 kB
.svelte-kit/output/server/chunks/plus.js 1.48 kB
.svelte-kit/output/server/entries/endpoints/api/targets/id/_server.ts.js 1.49 kB
.svelte-kit/output/server/chunks/loader-circle.js 1.50 kB
.svelte-kit/output/server/entries/endpoints/api/targets/slug/auth-methods/id/_server.ts.js 1.54 kB
.svelte-kit/output/server/entries/pages/(auth)/setup/_page.server.ts.js 1.54 kB
.svelte-kit/output/server/chunks/users.js 1.62 kB
.svelte-kit/output/server/entries/pages/_error.svelte.js 1.64 kB
.svelte-kit/output/server/chunks/permissions.js 1.76 kB
.svelte-kit/output/server/chunks/eye.js 1.78 kB
.svelte-kit/output/server/chunks/badge.js 1.87 kB
.svelte-kit/output/server/chunks/shield-check.js 1.95 kB
.svelte-kit/output/server/chunks/key-round.js 2.05 kB
.svelte-kit/output/server/chunks/server.js 2.14 kB
.svelte-kit/output/server/chunks/input.js 2.20 kB
.svelte-kit/output/server/entries/pages/(app)/api-keys/id/_page.server.ts.js 2.21 kB
.svelte-kit/output/server/chunks/card-title.js 2.35 kB
.svelte-kit/output/server/chunks/triangle-alert.js 2.39 kB
.svelte-kit/output/server/entries/pages/(app)/_page.server.ts.js 2.53 kB
.svelte-kit/output/server/entries/hooks.server.js 2.53 kB
.svelte-kit/output/server/chunks/connect-actions.js 2.76 kB
.svelte-kit/output/server/entries/pages/(app)/api-keys/_page.server.ts.js 3.06 kB
.svelte-kit/output/server/entries/endpoints/api/skill/_server.ts.js 3.12 kB
.svelte-kit/output/server/chunks/tokens.js 3.20 kB
.svelte-kit/output/server/chunks/label.js 3.21 kB
.svelte-kit/output/server/chunks/noop.js 3.38 kB
.svelte-kit/output/server/chunks/table-row.js 3.53 kB
.svelte-kit/output/server/entries/pages/(app)/connect/_page.svelte.js 4.26 kB
.svelte-kit/output/server/chunks/index2.js 4.30 kB
.svelte-kit/output/server/entries/pages/(auth)/login/_page.svelte.js 4.32 kB
.svelte-kit/output/server/chunks/install-scripts.js 4.53 kB
.svelte-kit/output/server/chunks/field-description.js 4.57 kB
.svelte-kit/output/server/chunks/copy.js 4.76 kB
.svelte-kit/output/server/chunks/Icon.js 4.77 kB
.svelte-kit/output/server/chunks/index3.js 4.79 kB
.svelte-kit/output/server/entries/pages/(auth)/setup/_page.svelte.js 5.11 kB
.svelte-kit/output/server/chunks/breadcrumb-page.js 5.43 kB
.svelte-kit/output/server/chunks/exports.js 5.59 kB
.svelte-kit/output/server/chunks/targets.js 5.71 kB
.svelte-kit/output/server/entries/pages/(app)/targets/page.server.ts.js 5.72 kB
.svelte-kit/output/server/chunks/auth-methods.js 6.59 kB
.svelte-kit/output/server/entries/endpoints/ssh/target/exec/server.ts.js 7.41 kB
.svelte-kit/output/server/chunks/internal.js 7.45 kB
.svelte-kit/output/server/chunks/switch.js 9.19 kB
.svelte-kit/output/server/chunks/dialog-description.js 9.50 kB
.svelte-kit/output/server/chunks/sheet-description.js 9.58 kB
.svelte-kit/output/server/chunks/create-id.js 13.07 kB
.svelte-kit/output/server/entries/endpoints/gateway/target/
...path
/_server.ts.js 13.29 kB
.svelte-kit/output/server/entries/pages/(app)/targets/slug/_page.server.ts.js 14.29 kB
.svelte-kit/output/server/chunks/connect-agent-flow.js 17.05 kB
.svelte-kit/output/server/remote-entry.js 19.02 kB
.svelte-kit/output/server/chunks/key.js 19.12 kB
.svelte-kit/output/server/entries/pages/(app)/settings/_page.svelte.js 19.24 kB
.svelte-kit/output/server/entries/pages/(app)/api-keys/id/_page.svelte.js 25.51 kB
.svelte-kit/output/server/chunks/shared.js 27.07 kB
.svelte-kit/output/server/entries/pages/(app)/logs/_page.svelte.js 34.84 kB
.svelte-kit/output/server/entries/pages/(app)/_page.svelte.js 35.56 kB
.svelte-kit/output/server/chunks/index4.js 41.12 kB
.svelte-kit/output/server/chunks/dropdown-menu-trigger.js 45.53 kB
.svelte-kit/output/server/chunks/tooltip-content.js 46.16 kB
.svelte-kit/output/server/entries/pages/_layout.svelte.js 46.96 kB
.svelte-kit/output/server/entries/pages/(app)/_layout.svelte.js 50.47 kB
.svelte-kit/output/server/entries/pages/(app)/api-keys/_page.svelte.js 62.91 kB
.svelte-kit/output/server/chunks/root.js 81.14 kB
.svelte-kit/output/server/entries/pages/(app)/targets/_page.svelte.js 84.92 kB
.svelte-kit/output/server/chunks/x.js 86.70 kB
.svelte-kit/output/server/index.js 125.80 kB
.svelte-kit/output/server/entries/pages/(app)/targets/slug/_page.svelte.js 156.41 kB
✓ built in 4.26s

Run npm run preview to preview your production build locally.

Using @sveltejs/adapter-node
✔ done ✅

shellgate@0.0.1 test
vitest run tests/unit/auth-methods.test.ts tests/integration/gateway.test.ts

RUN v3.2.4 /private/tmp/shellgate ⚠️ blocked here because Testcontainers could not find a container runtime in this environment

@matthiastjong matthiastjong merged commit 9afd58b into matthiastjong:main Apr 9, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants