Vault is optional — server falls back to bcrypt (Phase 1 behaviour) when VAULT_ADDR is not set. Full coexistence: existing bcrypt credentials continue to work until rotated. Changes: - src/vault/VaultClient.ts — wraps node-vault KV v2; writeSecret, readSecret, verifySecret (constant-time), deleteSecret - src/db/migrations/005_add_vault_path.sql — vault_path column on credentials - CredentialRepository — createWithVaultPath, updateVaultPath methods - CredentialService — routes generate/rotate through Vault when configured; bcrypt path unchanged - OAuth2Service — verifies via Vault when vaultPath set, bcrypt otherwise - src/app.ts — createVaultClientFromEnv() wired into service layer - ICredentialRow — vaultPath field added - docs/devops/environment-variables.md — VAULT_ADDR, VAULT_TOKEN, VAULT_MOUNT - docs/devops/vault-setup.md — dev quickstart, production config, migration guide - tests: 33/33 unit tests pass (VaultClient + CredentialService Vault path) - node-vault + @types/node-vault installed Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
59 lines
1.5 KiB
JSON
59 lines
1.5 KiB
JSON
{
|
|
"name": "sentryagent-idp",
|
|
"version": "1.0.0",
|
|
"description": "SentryAgent.ai Agent Identity Provider (AgentIdP)",
|
|
"main": "dist/server.js",
|
|
"scripts": {
|
|
"build": "tsc",
|
|
"start": "node dist/server.js",
|
|
"dev": "ts-node src/server.ts",
|
|
"test": "jest",
|
|
"test:unit": "jest tests/unit",
|
|
"test:integration": "jest tests/integration",
|
|
"db:migrate": "ts-node scripts/migrate.ts",
|
|
"lint": "eslint src --ext .ts",
|
|
"format": "prettier --write src/**/*.ts"
|
|
},
|
|
"dependencies": {
|
|
"bcryptjs": "^2.4.3",
|
|
"cors": "^2.8.5",
|
|
"dotenv": "^16.4.5",
|
|
"express": "^4.18.3",
|
|
"helmet": "^7.1.0",
|
|
"joi": "^17.12.3",
|
|
"jsonwebtoken": "^9.0.2",
|
|
"morgan": "^1.10.0",
|
|
"node-vault": "^0.12.0",
|
|
"pg": "^8.11.3",
|
|
"pino": "^8.19.0",
|
|
"pino-http": "^9.0.0",
|
|
"redis": "^4.6.13",
|
|
"uuid": "^9.0.1"
|
|
},
|
|
"devDependencies": {
|
|
"@types/bcryptjs": "^2.4.6",
|
|
"@types/cors": "^2.8.17",
|
|
"@types/express": "^4.17.21",
|
|
"@types/jest": "^29.5.12",
|
|
"@types/jsonwebtoken": "^9.0.6",
|
|
"@types/morgan": "^1.9.9",
|
|
"@types/node": "^20.12.7",
|
|
"@types/node-vault": "^0.9.1",
|
|
"@types/pg": "^8.11.5",
|
|
"@types/supertest": "^6.0.2",
|
|
"@types/uuid": "^9.0.8",
|
|
"@typescript-eslint/eslint-plugin": "^7.8.0",
|
|
"@typescript-eslint/parser": "^7.8.0",
|
|
"eslint": "^8.57.0",
|
|
"jest": "^29.7.0",
|
|
"prettier": "^3.2.5",
|
|
"supertest": "^6.3.4",
|
|
"ts-jest": "^29.1.2",
|
|
"ts-node": "^10.9.2",
|
|
"typescript": "^5.4.5"
|
|
},
|
|
"engines": {
|
|
"node": ">=18.0.0"
|
|
}
|
|
}
|