Tags: Infisical/agent-vault
Tags
feat(catalog): add 13 service templates and fix four incorrect ones (#… …361) ## Summary Brings the built-in service catalog closer to Infisical's proxied-service templates. Four files: `internal/catalog/catalog.go`, `internal/catalog/catalog_test.go` (new), `cmd/catalog.go`, `web/src/pages/vault/ServicesTab.tsx`. ### New templates (13) Every host and auth header checked against the vendor's current docs. | Template | Host | Auth | |---|---|---| | `cohere` | `api.cohere.com` | bearer | | `deepseek` | `api.deepseek.com` | bearer | | `discord` | `discord.com/api/*` | api-key, `Authorization: Bot ` | | `fireworks` | `api.fireworks.ai` | bearer | | `gemini` | `generativelanguage.googleapis.com` | api-key, `x-goog-api-key` | | `gitlab` | `gitlab.com/api/*` | api-key, `PRIVATE-TOKEN` | | `groq` | `api.groq.com` | bearer | | `mistral` | `api.mistral.ai` | bearer | | `openrouter` | `openrouter.ai` | bearer | | `perplexity` | `api.perplexity.ai` | bearer | | `telegram` | `api.telegram.org` | passthrough + `path` substitution | | `together` | `api.together.ai` | bearer | | `xai` | `api.x.ai` | bearer | ### Fixed templates (4) The first three were `bearer`, but none of those services accept `Authorization: Bearer <key>`. | Template | Was | Now | |---|---|---| | `linear` | `bearer` | api-key on `Authorization`, no prefix (Linear wants the bare token) | | `supabase` | `bearer` | api-key on `apikey` | | `pagerduty` | `bearer` | custom header `Token token={{ PAGERDUTY_TOKEN }}` | | `stripe` | key `STRIPE_KEY` | key `STRIPE_SECRET_KEY` | `pagerduty` needs `custom` because an api-key prefix cannot produce `Token token=<key>`: `Auth.Resolve` concatenates the prefix verbatim, with no room for the trailing `=`. Heads up on `stripe`: a vault already holding a `STRIPE_KEY` credential will stop getting the "unused credential, add Stripe as a service?" suggestion, since that matches on `suggested_credential_key`. ### `catalog.Template` gains two fields `Headers` seeds custom auth, `Substitutions` seeds the substitution editor independent of auth type. This lets a preset broker a credential that does not travel in a constructed header. `telegram` is the only such template: its token is a URL path segment (`/bot<token>/sendMessage`). Side effect worth noting: selecting a `custom` preset now produces a submittable form. Previously `applyPreset` set the auth type but left the header rows blank, so `canSubmit` always failed. ### `agent-vault catalog` output Renders `passthrough + substitution` when a template carries one. Without it, `telegram` showed as bare `passthrough`, which reads as "no credential involved" and would lead someone configuring by hand to omit the substitution and get no injection. ## Type of change - [x] Bug fix - [x] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan New `catalog_test.go` runs every template through the same mapping `applyPreset` uses and validates the result, so a preset that would produce an unsubmittable form or a rejected proposal fails the build. One test covers Telegram's `<id>:<token>` surviving path escaping. Manually verified against a local instance: - All 35 templates accepted by the real HTTP ingest via `vault service add --file` - Real proxy traffic against a loopback echo server confirmed what upstreams receive: `Token token=...`, `Bot <token>`, bare `Authorization: lin_api_...`, `apikey: ...`, `PRIVATE-TOKEN: ...`, and Telegram's rewritten path - Browser click-through of every changed preset, plus the credential-suggestion deep link (`?preset=openrouter`) - [x] Existing tests pass (`make test`) - [x] Added/updated tests for new behavior - [x] Manual testing (describe below) ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
feat: add Pi, Devin, Windsurf, Cline, and Roo Code to knownAgents (#295) ## Summary Adds five new agents to the `knownAgents` list in `cmd/run.go` so that `agent-vault vault run` auto-installs the Agent Vault CLI skill for them: | Agent | Binary name(s) | Skills directory | |-------|---------------|-----------------| | Pi | `pi` | `~/.pi/agent/skills/` | | Devin CLI | `devin` | `~/.config/devin/skills/` | | Windsurf / Devin Desktop | `windsurf`, `devin-desktop` | `~/.codeium/windsurf/skills/` | | Cline | `cline` | `~/.cline/skills/` | | Roo Code | `roo` | `~/.roo/skills/` | Skill directories were sourced from each agent's official docs/repos. Devin CLI path confirmed via [Devin CLI skills docs](https://docs.devin.ai/cli/extensibility/skills/overview#where-skills-live). ## Type of change - [x] New feature ## Test plan - [x] Existing tests pass (`make test`) - [ ] Added/updated tests for new behavior - [ ] Manual testing (describe below) Full `go test ./...` passes with no failures. ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) Link to Devin session: https://app.devin.ai/sessions/ceba9594661945f3b0d72dbf25928467 --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: jake <jake@infisical.com>
feat: allow users to remove themselves from a vault (#290) ## Summary Adds `POST /v1/vaults/{name}/leave` endpoint and corresponding frontend UI so users can remove themselves from a vault. Previously the only way to lose vault access was for an admin to remove you or to delete the entire vault. **Backend** - new `handleVaultLeave` handler that revokes the caller's own vault grant. Guards: - Blocks the last admin from leaving (prevents orphaned vaults with no admin) - Blocks scoped sessions (they can't modify their own access) - Requires an explicit grant (implicit owner access can't be "left") **Frontend** - two entry points: - Vault list cards show a leave icon (door-arrow) for all explicit-membership vaults - Users tab shows a "Leave vault" dropdown action on the current user's row (visible to all roles, not just admins) Both surfaces open a confirmation modal before calling the API. Leaving from the Users tab redirects to the home page. ## Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan - [x] Existing tests pass (`make test`) - [x] Added/updated tests for new behavior - [x] Manual testing (describe below) ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) --------- Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
feat: add database_backend to server-start telemetry (#276) ## Summary Adds `database_backend` property to the `av.server-start` telemetry event to track which database backend is in use. ## Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan - [x] Existing tests pass (`make test`) ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
feat: add PostgreSQL database support for production deployments (#273) ## Summary Adds PostgreSQL as an alternative database backend so Agent Vault can run multiple stateless instances against a shared database. Each instance connects to the same Postgres, shares the same CA root certificate (stored encrypted in the DB), and uses advisory locks to prevent conflicting writes. - `DATABASE_URL` env var (or `--database-url` flag) switches from SQLite to Postgres - `migrate-db` command copies all data from SQLite to Postgres in one transaction - GORM-based migration runner replaces embedded SQL files, with `pg_advisory_lock` for safe concurrent startup - CA root key stored in database (not disk) so all instances share the same MITM cert - Master key setup uses `ON CONFLICT DO NOTHING` + re-read for safe multi-pod races - `master-password` CLI commands blocked when `DATABASE_URL` is set (use `--force` after stopping all instances) - `owner reset` blocked when `DATABASE_URL` is set (only removes local files, not the shared DB) - Connection pool tunable via `DB_MAX_OPEN_CONNS`, `DB_MAX_IDLE_CONNS`, `DB_CONN_MAX_LIFETIME` - Health endpoint pings Postgres connection, returns 503 when unreachable - Full docs: Postgres guide, Kubernetes example, Docker Compose example, Fly.io integration ## Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan - [x] Existing tests pass (`make test`) - [x] Added/updated tests for new behavior - [x] Manual testing (describe below) Tested on: - Local Postgres (fresh setup, migration, rollback, proxy with credential injection, proposals) - Docker Compose (2 replicas, cross-instance state sharing, proxy on both instances, blocked commands inside container) - DigitalOcean Kubernetes (2 replicas, managed Postgres, full CRUD, agent lifecycle, CA sharing verified via cert fingerprint) - Fly.io (2 machines, Fly Postgres with auto `DATABASE_URL`, registration + data creation) - Connection pool env vars with custom values - `--database-url` CLI flag (vs env var) - All 50 SQL-to-Go migration conversions verified against originals ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) --------- Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
fix: include substitution keys in credential-usage checks (#272) ## Summary The "unused credential" suggestion and the credential-usage endpoint only inspected auth fields (token, username, password, key, custom headers), missing credentials referenced via URL substitutions. Services using passthrough auth with substitutions (e.g. `ANTHROPIC_API_KEY` on `api.anthropic.com`) appeared unused even though the proxy was actively injecting them. - Frontend: extracted a `serviceCredentialKeys()` helper mirroring `Service.CredentialKeys()` from `broker.go` (switch on auth type + substitution rollup) so the used-keys set stays in sync with the proxy's injection logic - Backend: credential-usage endpoint now calls `svc.CredentialKeys()` instead of `svc.Auth.CredentialKeys()`, so the delete-confirmation dialog also warns about substitution references ## Type of change - [x] Bug fix - [ ] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan <!-- How did you verify this works? --> - [x] Existing tests pass (`make test`) - [ ] Added/updated tests for new behavior - [x] Manual testing (describe below) ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
feat: add anonymous usage telemetry (#270) ## Summary Adds anonymous usage telemetry to help improve the product, following the same pattern as the Infisical CLI. Opt-out: `AGENT_VAULT_TELEMETRY=false` env var or `--telemetry=false` flag. No credential values or request payloads are ever included. ## Type of change - [ ] Bug fix - [x] New feature - [ ] Refactor / cleanup - [ ] Documentation - [ ] CI / build ## Test plan - [x] Existing tests pass (`make test`) - [ ] Added/updated tests for new behavior - [ ] Manual testing (describe below) ## Security checklist - [x] No secrets or credentials in code - [x] No new unauthenticated endpoints - [x] Input validation on new API surfaces - [x] Checked for OWASP top 10 (injection, XSS, etc.) --------- Co-authored-by: saif <11242541+saifsmailbox98@users.noreply.github.com>
v0.35.1 fix(broker): resolve dynamic secrets through the MITM proxy (#269) The MITM proxy snapshotted a nil dynamic-secret resolver at attach time, before Start() built it, so proxied requests for an Infisical dynamic credential failed with credential_not_found. A late-binding adapter now reads the resolver per request, so static and dynamic credentials resolve identically.
PreviousNext