Problem
When adding or editing a service, every credential-reference field (bearer/basic/api-key credential keys, the URL-substitution key, and custom header values) required typing the exact credential key name from memory. Typos or forgotten key names made the form error-prone, especially for vaults with many stored credentials.
Solution
- Wire the bearer/basic/api-key credential fields and the URL-substitution key field into the existing Combobox component, sourced from GET /v1/credentials for the current vault — shows all keys on focus, filters as you type, and still allows free text for keys that don't exist yet.
- Add a new TemplateInput component for custom header values, which opens a credential picker when the caret is inside an unclosed {{ ... }} placeholder and inserts {{ KEY }} on selection.
- Both suggestion popovers render as position:fixed portals and track their anchor input on ancestor scroll/resize, so they don't get stranded when the modal body scrolls.
- Suggestions degrade silently to plain text inputs if /v1/credentials is unavailable.
Scope
- web/src/components/Combobox.tsx — support custom inputClassName for compact/inline usage.
- web/src/components/TemplateInput.tsx — new component.
- web/src/pages/vault/ServicesTab.tsx — fetch credential keys, wire fields to Combobox/TemplateInput.
Problem
When adding or editing a service, every credential-reference field (bearer/basic/api-key credential keys, the URL-substitution key, and custom header values) required typing the exact credential key name from memory. Typos or forgotten key names made the form error-prone, especially for vaults with many stored credentials.
Solution
Scope