@id-wispera/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -0
- package/dist/audit.d.ts +68 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +252 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/index.d.ts +8 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychainProvider.d.ts +40 -0
- package/dist/auth/keychainProvider.d.ts.map +1 -0
- package/dist/auth/keychainProvider.js +98 -0
- package/dist/auth/keychainProvider.js.map +1 -0
- package/dist/auth/passphraseProvider.d.ts +80 -0
- package/dist/auth/passphraseProvider.d.ts.map +1 -0
- package/dist/auth/passphraseProvider.js +188 -0
- package/dist/auth/passphraseProvider.js.map +1 -0
- package/dist/auth/sessionTokenManager.d.ts +106 -0
- package/dist/auth/sessionTokenManager.d.ts.map +1 -0
- package/dist/auth/sessionTokenManager.js +263 -0
- package/dist/auth/sessionTokenManager.js.map +1 -0
- package/dist/delegation.d.ts +81 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/delegation.js +299 -0
- package/dist/delegation.js.map +1 -0
- package/dist/detection.d.ts +35 -0
- package/dist/detection.d.ts.map +1 -0
- package/dist/detection.js +474 -0
- package/dist/detection.js.map +1 -0
- package/dist/exec/execManager.d.ts +60 -0
- package/dist/exec/execManager.d.ts.map +1 -0
- package/dist/exec/execManager.js +226 -0
- package/dist/exec/execManager.js.map +1 -0
- package/dist/exec/index.d.ts +6 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +98 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/base.d.ts +64 -0
- package/dist/integrations/base.d.ts.map +1 -0
- package/dist/integrations/base.js +173 -0
- package/dist/integrations/base.js.map +1 -0
- package/dist/integrations/envMapping.d.ts +47 -0
- package/dist/integrations/envMapping.d.ts.map +1 -0
- package/dist/integrations/envMapping.js +174 -0
- package/dist/integrations/envMapping.js.map +1 -0
- package/dist/integrations/google-a2a.d.ts +48 -0
- package/dist/integrations/google-a2a.d.ts.map +1 -0
- package/dist/integrations/google-a2a.js +108 -0
- package/dist/integrations/google-a2a.js.map +1 -0
- package/dist/integrations/index.d.ts +14 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +14 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain.d.ts +38 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +45 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/openai-agents.d.ts +76 -0
- package/dist/integrations/openai-agents.d.ts.map +1 -0
- package/dist/integrations/openai-agents.js +95 -0
- package/dist/integrations/openai-agents.js.map +1 -0
- package/dist/integrations/slack.d.ts +59 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +113 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/integrations/types.d.ts +107 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +6 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/locations.d.ts +157 -0
- package/dist/locations.d.ts.map +1 -0
- package/dist/locations.js +733 -0
- package/dist/locations.js.map +1 -0
- package/dist/passport.d.ts +70 -0
- package/dist/passport.d.ts.map +1 -0
- package/dist/passport.js +429 -0
- package/dist/passport.js.map +1 -0
- package/dist/policy.d.ts +80 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +392 -0
- package/dist/policy.js.map +1 -0
- package/dist/providers/openclaw.d.ts +80 -0
- package/dist/providers/openclaw.d.ts.map +1 -0
- package/dist/providers/openclaw.js +712 -0
- package/dist/providers/openclaw.js.map +1 -0
- package/dist/provisioning/adminPassport.d.ts +51 -0
- package/dist/provisioning/adminPassport.d.ts.map +1 -0
- package/dist/provisioning/adminPassport.js +101 -0
- package/dist/provisioning/adminPassport.js.map +1 -0
- package/dist/provisioning/index.d.ts +81 -0
- package/dist/provisioning/index.d.ts.map +1 -0
- package/dist/provisioning/index.js +141 -0
- package/dist/provisioning/index.js.map +1 -0
- package/dist/provisioning/provider.d.ts +59 -0
- package/dist/provisioning/provider.d.ts.map +1 -0
- package/dist/provisioning/provider.js +52 -0
- package/dist/provisioning/provider.js.map +1 -0
- package/dist/provisioning/providers/anthropic.d.ts +32 -0
- package/dist/provisioning/providers/anthropic.d.ts.map +1 -0
- package/dist/provisioning/providers/anthropic.js +116 -0
- package/dist/provisioning/providers/anthropic.js.map +1 -0
- package/dist/provisioning/providers/aws.d.ts +29 -0
- package/dist/provisioning/providers/aws.d.ts.map +1 -0
- package/dist/provisioning/providers/aws.js +455 -0
- package/dist/provisioning/providers/aws.js.map +1 -0
- package/dist/provisioning/providers/azure-entra.d.ts +32 -0
- package/dist/provisioning/providers/azure-entra.d.ts.map +1 -0
- package/dist/provisioning/providers/azure-entra.js +312 -0
- package/dist/provisioning/providers/azure-entra.js.map +1 -0
- package/dist/provisioning/providers/github.d.ts +24 -0
- package/dist/provisioning/providers/github.d.ts.map +1 -0
- package/dist/provisioning/providers/github.js +219 -0
- package/dist/provisioning/providers/github.js.map +1 -0
- package/dist/provisioning/providers/google-cloud.d.ts +34 -0
- package/dist/provisioning/providers/google-cloud.d.ts.map +1 -0
- package/dist/provisioning/providers/google-cloud.js +366 -0
- package/dist/provisioning/providers/google-cloud.js.map +1 -0
- package/dist/provisioning/providers/openai.d.ts +29 -0
- package/dist/provisioning/providers/openai.d.ts.map +1 -0
- package/dist/provisioning/providers/openai.js +263 -0
- package/dist/provisioning/providers/openai.js.map +1 -0
- package/dist/provisioning/providers/sendgrid.d.ts +27 -0
- package/dist/provisioning/providers/sendgrid.d.ts.map +1 -0
- package/dist/provisioning/providers/sendgrid.js +186 -0
- package/dist/provisioning/providers/sendgrid.js.map +1 -0
- package/dist/provisioning/providers/twilio.d.ts +27 -0
- package/dist/provisioning/providers/twilio.d.ts.map +1 -0
- package/dist/provisioning/providers/twilio.js +194 -0
- package/dist/provisioning/providers/twilio.js.map +1 -0
- package/dist/provisioning/types.d.ts +274 -0
- package/dist/provisioning/types.d.ts.map +1 -0
- package/dist/provisioning/types.js +6 -0
- package/dist/provisioning/types.js.map +1 -0
- package/dist/sharing.d.ts +60 -0
- package/dist/sharing.d.ts.map +1 -0
- package/dist/sharing.js +305 -0
- package/dist/sharing.js.map +1 -0
- package/dist/types.d.ts +396 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +88 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +45 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/dist/vault.d.ts +151 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +499 -0
- package/dist/vault.js.map +1 -0
- package/package.json +117 -0
package/README.md
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# @id-wispera/core
|
|
2
|
+
|
|
3
|
+
Core governance engine for ID Wispera - the Identity Whisperer for AI Agents.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @id-wispera/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Type Definitions**: Complete TypeScript types for passports, visas, and policies
|
|
14
|
+
- **Encrypted Vault**: AES-256-GCM encrypted local storage with Argon2id key derivation
|
|
15
|
+
- **Passport Management**: CRUD operations for credential passports
|
|
16
|
+
- **Credential Detection**: Regex + heuristic patterns for detecting exposed credentials
|
|
17
|
+
- **Audit Trail**: Append-only audit log for compliance
|
|
18
|
+
- **Policy Engine**: Cedar-inspired declarative policy evaluation
|
|
19
|
+
- **Secure Sharing**: Zero-knowledge credential sharing
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
import { initVault, createPassport, detectCredentials } from '@id-wispera/core';
|
|
25
|
+
|
|
26
|
+
// Initialize encrypted vault
|
|
27
|
+
const vault = await initVault('your-master-passphrase');
|
|
28
|
+
|
|
29
|
+
// Create a passport for a credential
|
|
30
|
+
const passport = await createPassport(vault, {
|
|
31
|
+
name: 'OpenAI Production',
|
|
32
|
+
credentialType: 'api-key',
|
|
33
|
+
credentialValue: 'sk-...',
|
|
34
|
+
visaType: 'access',
|
|
35
|
+
platforms: ['openai'],
|
|
36
|
+
scope: ['chat', 'completions'],
|
|
37
|
+
humanOwner: 'alice@company.com',
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Detect exposed credentials in text
|
|
41
|
+
const results = detectCredentials(`
|
|
42
|
+
API_KEY=sk-proj-abc123...
|
|
43
|
+
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
|
|
44
|
+
`);
|
|
45
|
+
// Returns array of detected credentials with type and position
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## API Reference
|
|
49
|
+
|
|
50
|
+
### Auth
|
|
51
|
+
|
|
52
|
+
The auth module provides the zero-plaintext credential architecture. No credential material is ever exposed in environment variables, CLI arguments, or logs.
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import {
|
|
56
|
+
PassphraseProvider,
|
|
57
|
+
SessionTokenManager,
|
|
58
|
+
KeychainProvider,
|
|
59
|
+
} from '@id-wispera/core/auth';
|
|
60
|
+
|
|
61
|
+
// PassphraseProvider — interactive login, derives vault key from passphrase
|
|
62
|
+
const pp = new PassphraseProvider();
|
|
63
|
+
const vaultKey = await pp.deriveKey(passphrase);
|
|
64
|
+
|
|
65
|
+
// KeychainProvider — caches derived key in the OS keychain (macOS Keychain, libsecret, Windows Credential Manager)
|
|
66
|
+
const kc = new KeychainProvider();
|
|
67
|
+
await kc.store(vaultKey);
|
|
68
|
+
const cached = await kc.retrieve();
|
|
69
|
+
|
|
70
|
+
// SessionTokenManager — create, validate, and revoke scoped session tokens for headless/CI use
|
|
71
|
+
const stm = new SessionTokenManager(vault);
|
|
72
|
+
const token = await stm.create({ name: 'ci-deploy', scope: ['read', 'list'], ttl: '24h' });
|
|
73
|
+
const session = await stm.validate(token);
|
|
74
|
+
await stm.revoke(token.id);
|
|
75
|
+
const tokens = await stm.list();
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
| Export | Purpose |
|
|
79
|
+
|--------|---------|
|
|
80
|
+
| `PassphraseProvider` | Derive vault key from passphrase (interactive login) |
|
|
81
|
+
| `SessionTokenManager` | Create / validate / revoke / list scoped session tokens |
|
|
82
|
+
| `KeychainProvider` | Cache vault key in the OS keychain for session persistence |
|
|
83
|
+
|
|
84
|
+
### Vault
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { initVault, unlockVault, lockVault } from '@id-wispera/core/vault';
|
|
88
|
+
|
|
89
|
+
// Initialize a new vault
|
|
90
|
+
const vault = await initVault(passphrase, storagePath?);
|
|
91
|
+
|
|
92
|
+
// Unlock existing vault
|
|
93
|
+
const vault = await unlockVault(passphrase);
|
|
94
|
+
|
|
95
|
+
// Lock vault (clears keys from memory)
|
|
96
|
+
lockVault(vault);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Passport Management
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { createPassport, getPassport, listPassports, revokePassport } from '@id-wispera/core/passport';
|
|
103
|
+
|
|
104
|
+
// Create passport
|
|
105
|
+
const passport = await createPassport(vault, input);
|
|
106
|
+
|
|
107
|
+
// Get by ID
|
|
108
|
+
const passport = await getPassport(vault, id);
|
|
109
|
+
|
|
110
|
+
// List with filters
|
|
111
|
+
const passports = await listPassports(vault, { status: 'active', platform: 'openai' });
|
|
112
|
+
|
|
113
|
+
// Revoke
|
|
114
|
+
const revoked = await revokePassport(vault, id, 'Security concern', 'admin@company.com');
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Credential Detection
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { detectCredentials, classifyCredential } from '@id-wispera/core/detection';
|
|
121
|
+
|
|
122
|
+
// Detect credentials in text
|
|
123
|
+
const results = detectCredentials(text);
|
|
124
|
+
// Returns: { type, value, position, confidence }[]
|
|
125
|
+
|
|
126
|
+
// Classify a known credential
|
|
127
|
+
const type = classifyCredential('sk-proj-abc123...');
|
|
128
|
+
// Returns: 'api-key'
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Policy Engine
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { evaluatePolicy, validatePassport } from '@id-wispera/core/policy';
|
|
135
|
+
|
|
136
|
+
const rules = [
|
|
137
|
+
{
|
|
138
|
+
id: 'max-validity',
|
|
139
|
+
name: 'Maximum Validity Period',
|
|
140
|
+
condition: { maxValidityDays: 90 },
|
|
141
|
+
effect: 'deny',
|
|
142
|
+
},
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
// Evaluate a specific action
|
|
146
|
+
const decision = evaluatePolicy(passport, 'access', rules);
|
|
147
|
+
|
|
148
|
+
// Validate passport against all rules
|
|
149
|
+
const violations = validatePassport(passport, rules);
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Audit Trail
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { logAction, getAuditLog } from '@id-wispera/core/audit';
|
|
156
|
+
|
|
157
|
+
// Log an action
|
|
158
|
+
await logAction(vault, {
|
|
159
|
+
passportId: passport.id,
|
|
160
|
+
action: 'accessed',
|
|
161
|
+
actor: 'claude-agent',
|
|
162
|
+
platform: 'mcp',
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Get audit log
|
|
166
|
+
const entries = await getAuditLog(vault, passportId?, filters?);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Secure Sharing
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
import { createShareLink, resolveShareLink } from '@id-wispera/core/sharing';
|
|
173
|
+
|
|
174
|
+
// Create encrypted share payload
|
|
175
|
+
const { payload, key } = createShareLink(passport, {
|
|
176
|
+
scope: 'read-only',
|
|
177
|
+
expiresAt: '2024-12-31',
|
|
178
|
+
maxViews: 1,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Resolve (decrypt) shared passport
|
|
182
|
+
const passport = resolveShareLink(payload, key);
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Credential Provisioning
|
|
186
|
+
|
|
187
|
+
Programmatically create API keys at vendor APIs and wrap them as governed passports.
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import { provisionAndCreatePassport, listProviders } from '@id-wispera/core/provisioning';
|
|
191
|
+
|
|
192
|
+
// List all 8 supported providers
|
|
193
|
+
const providers = listProviders();
|
|
194
|
+
// → openai, aws, google-cloud, azure-entra, github, twilio, sendgrid, anthropic
|
|
195
|
+
|
|
196
|
+
// Provision and govern in one step
|
|
197
|
+
const { credential, passport } = await provisionAndCreatePassport(vault, {
|
|
198
|
+
provider: 'openai',
|
|
199
|
+
name: 'Agent Key',
|
|
200
|
+
humanOwner: 'alice@company.com',
|
|
201
|
+
config: { provider: 'openai', organizationId: 'org-xxx', projectId: 'proj-xxx', keyType: 'service-account' },
|
|
202
|
+
}, { type: 'api-key', key: 'sk-admin-...' });
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
#### AdminPassport
|
|
206
|
+
|
|
207
|
+
`AdminPassport` is a special passport type used to authenticate provisioning operations. Instead of passing raw admin credentials, wrap them in an `AdminPassport` for audit-trail coverage and policy enforcement:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import { AdminPassport } from '@id-wispera/core/provisioning';
|
|
211
|
+
|
|
212
|
+
// Create an admin passport for provider operations
|
|
213
|
+
const adminPassport = new AdminPassport(vault, {
|
|
214
|
+
provider: 'openai',
|
|
215
|
+
credentialName: 'openai-admin-key',
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// Use it for provisioning — the admin credential is never exposed as plaintext
|
|
219
|
+
const { credential, passport } = await provisionAndCreatePassport(vault, request, adminPassport);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
| Provider | Create | Rotate | Revoke | List | Scoped | Expiry |
|
|
223
|
+
|---|---|---|---|---|---|---|
|
|
224
|
+
| OpenAI | Yes | Yes | Yes | Yes | Yes | No |
|
|
225
|
+
| AWS | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
226
|
+
| Google Cloud | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
227
|
+
| Azure Entra | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
228
|
+
| GitHub | Yes | Yes | No | No | Yes | Yes |
|
|
229
|
+
| Twilio | Yes | Yes | Yes | Yes | Yes | No |
|
|
230
|
+
| SendGrid | Yes | Yes | Yes | Yes | Yes | No |
|
|
231
|
+
| Anthropic | No | No | Yes | Yes | No | No |
|
|
232
|
+
|
|
233
|
+
See [Provisioning docs](../../docs/provisioning.md) for full provider examples and authentication details.
|
|
234
|
+
|
|
235
|
+
### Framework Integrations
|
|
236
|
+
|
|
237
|
+
Governed credential access for AI agent frameworks. Every access is cached, audited, and policy-enforced.
|
|
238
|
+
|
|
239
|
+
```typescript
|
|
240
|
+
import { WisperaCredentialProvider, WisperaOpenAIAgentProvider } from '@id-wispera/core';
|
|
241
|
+
|
|
242
|
+
// Base provider -- works with any framework
|
|
243
|
+
const provider = new WisperaCredentialProvider({ vault });
|
|
244
|
+
const key = await provider.getOpenAIKey('openai-prod');
|
|
245
|
+
|
|
246
|
+
// OpenAI Agents SDK -- agent keys, tool auth, handoffs
|
|
247
|
+
const agents = new WisperaOpenAIAgentProvider({ vault });
|
|
248
|
+
const agentKey = await agents.getAgentKey('openai-prod');
|
|
249
|
+
const toolAuth = await agents.getToolAuth('serper-key');
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
| Integration | Class | What It Does |
|
|
253
|
+
|---|---|---|
|
|
254
|
+
| Base | `WisperaCredentialProvider` | Get, cache, and audit any credential |
|
|
255
|
+
| LangChain.js | `WisperaLangChainProvider` | API keys for LangChain LLM constructors |
|
|
256
|
+
| OpenAI Agents | `WisperaOpenAIAgentProvider` | Agent keys, tool auth, handoff scoping |
|
|
257
|
+
| Google A2A | `WisperaA2AProvider` | Agent Card credentials, auth validation |
|
|
258
|
+
| Slack | `WisperaSlackProvider` | Bot tokens, webhooks, Socket Mode |
|
|
259
|
+
|
|
260
|
+
See [Integrations docs](../../docs/integrations.md) for full examples in TypeScript, Python, and Go.
|
|
261
|
+
|
|
262
|
+
## Types
|
|
263
|
+
|
|
264
|
+
See [types.ts](./src/types.ts) for complete type definitions.
|
|
265
|
+
|
|
266
|
+
## License
|
|
267
|
+
|
|
268
|
+
MIT
|
package/dist/audit.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Audit Trail
|
|
3
|
+
* Append-only audit log for compliance and visibility
|
|
4
|
+
*/
|
|
5
|
+
import { AuditEntry, AuditFilters, AuditAction, Platform } from './types.js';
|
|
6
|
+
import { Vault } from './vault.js';
|
|
7
|
+
/**
|
|
8
|
+
* Input for logging an action
|
|
9
|
+
*/
|
|
10
|
+
export interface LogActionInput {
|
|
11
|
+
passportId: string;
|
|
12
|
+
action: AuditAction;
|
|
13
|
+
actor: string;
|
|
14
|
+
platform?: Platform;
|
|
15
|
+
details?: string;
|
|
16
|
+
metadata?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Log an action to the audit trail
|
|
20
|
+
*/
|
|
21
|
+
export declare function logAction(vault: Vault, input: LogActionInput): Promise<AuditEntry>;
|
|
22
|
+
/**
|
|
23
|
+
* Get audit log entries with optional filters
|
|
24
|
+
*/
|
|
25
|
+
export declare function getAuditLog(vault: Vault, passportId?: string, filters?: AuditFilters): Promise<AuditEntry[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Export audit log to a file format
|
|
28
|
+
*/
|
|
29
|
+
export declare function exportAuditLog(vault: Vault, format: 'json' | 'csv', filters?: AuditFilters): Promise<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Get audit statistics for a passport
|
|
32
|
+
*/
|
|
33
|
+
export declare function getAuditStats(vault: Vault, passportId?: string): Promise<{
|
|
34
|
+
totalActions: number;
|
|
35
|
+
byAction: Record<AuditAction, number>;
|
|
36
|
+
byActor: Record<string, number>;
|
|
37
|
+
byPlatform: Record<string, number>;
|
|
38
|
+
firstAction?: AuditEntry;
|
|
39
|
+
lastAction?: AuditEntry;
|
|
40
|
+
actionsLast24h: number;
|
|
41
|
+
actionsLast7d: number;
|
|
42
|
+
}>;
|
|
43
|
+
/**
|
|
44
|
+
* Get recent activity across all passports
|
|
45
|
+
*/
|
|
46
|
+
export declare function getRecentActivity(vault: Vault, limit?: number): Promise<AuditEntry[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get access history for a specific passport
|
|
49
|
+
*/
|
|
50
|
+
export declare function getAccessHistory(vault: Vault, passportId: string): Promise<AuditEntry[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Check if a passport has been accessed recently
|
|
53
|
+
*/
|
|
54
|
+
export declare function wasAccessedRecently(vault: Vault, passportId: string, withinMinutes?: number): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Search audit log by text in details
|
|
57
|
+
*/
|
|
58
|
+
export declare function searchAuditLog(vault: Vault, searchTerm: string, passportId?: string): Promise<AuditEntry[]>;
|
|
59
|
+
/**
|
|
60
|
+
* Get suspicious activity patterns
|
|
61
|
+
* Returns entries that might indicate security concerns
|
|
62
|
+
*/
|
|
63
|
+
export declare function getSuspiciousActivity(vault: Vault, passportId?: string): Promise<{
|
|
64
|
+
rapidAccess: AuditEntry[];
|
|
65
|
+
unusualActors: AuditEntry[];
|
|
66
|
+
afterHoursAccess: AuditEntry[];
|
|
67
|
+
}>;
|
|
68
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,UAAU,CAAC,CAcrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,KAAK,EACZ,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,EAAE,CAAC,CAgDvB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GAAG,KAAK,EACtB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC,CAyCjB;AAMD;;GAEG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,KAAK,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAgED;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,KAAK,EACZ,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC,CAEvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC,CAEvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAMD;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAWvB;AAMD;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,KAAK,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IACT,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,gBAAgB,EAAE,UAAU,EAAE,CAAC;CAChC,CAAC,CA8CD"}
|
package/dist/audit.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Audit Trail
|
|
3
|
+
* Append-only audit log for compliance and visibility
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Log an action to the audit trail
|
|
7
|
+
*/
|
|
8
|
+
export async function logAction(vault, input) {
|
|
9
|
+
const entry = {
|
|
10
|
+
id: crypto.randomUUID(),
|
|
11
|
+
passportId: input.passportId,
|
|
12
|
+
action: input.action,
|
|
13
|
+
actor: input.actor,
|
|
14
|
+
timestamp: new Date().toISOString(),
|
|
15
|
+
platform: input.platform,
|
|
16
|
+
details: input.details,
|
|
17
|
+
metadata: input.metadata,
|
|
18
|
+
};
|
|
19
|
+
await vault.addAuditEntry(entry);
|
|
20
|
+
return entry;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get audit log entries with optional filters
|
|
24
|
+
*/
|
|
25
|
+
export async function getAuditLog(vault, passportId, filters) {
|
|
26
|
+
let entries = await vault.getAuditLog(passportId);
|
|
27
|
+
if (!filters) {
|
|
28
|
+
return entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
29
|
+
}
|
|
30
|
+
// Apply filters
|
|
31
|
+
if (filters.action) {
|
|
32
|
+
const actions = Array.isArray(filters.action) ? filters.action : [filters.action];
|
|
33
|
+
entries = entries.filter((e) => actions.includes(e.action));
|
|
34
|
+
}
|
|
35
|
+
if (filters.actor) {
|
|
36
|
+
entries = entries.filter((e) => e.actor === filters.actor);
|
|
37
|
+
}
|
|
38
|
+
if (filters.platform) {
|
|
39
|
+
entries = entries.filter((e) => e.platform === filters.platform);
|
|
40
|
+
}
|
|
41
|
+
if (filters.startDate) {
|
|
42
|
+
const start = new Date(filters.startDate);
|
|
43
|
+
entries = entries.filter((e) => new Date(e.timestamp) >= start);
|
|
44
|
+
}
|
|
45
|
+
if (filters.endDate) {
|
|
46
|
+
const end = new Date(filters.endDate);
|
|
47
|
+
entries = entries.filter((e) => new Date(e.timestamp) <= end);
|
|
48
|
+
}
|
|
49
|
+
// Sort by timestamp (newest first)
|
|
50
|
+
entries.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
51
|
+
// Apply pagination
|
|
52
|
+
if (filters.offset) {
|
|
53
|
+
entries = entries.slice(filters.offset);
|
|
54
|
+
}
|
|
55
|
+
if (filters.limit) {
|
|
56
|
+
entries = entries.slice(0, filters.limit);
|
|
57
|
+
}
|
|
58
|
+
return entries;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Export audit log to a file format
|
|
62
|
+
*/
|
|
63
|
+
export async function exportAuditLog(vault, format, filters) {
|
|
64
|
+
const entries = await getAuditLog(vault, undefined, filters);
|
|
65
|
+
if (format === 'json') {
|
|
66
|
+
return JSON.stringify({
|
|
67
|
+
auditLog: entries,
|
|
68
|
+
exportedAt: new Date().toISOString(),
|
|
69
|
+
totalEntries: entries.length,
|
|
70
|
+
}, null, 2);
|
|
71
|
+
}
|
|
72
|
+
// CSV format
|
|
73
|
+
const headers = [
|
|
74
|
+
'id',
|
|
75
|
+
'passportId',
|
|
76
|
+
'action',
|
|
77
|
+
'actor',
|
|
78
|
+
'timestamp',
|
|
79
|
+
'platform',
|
|
80
|
+
'details',
|
|
81
|
+
];
|
|
82
|
+
const rows = entries.map((e) => [
|
|
83
|
+
e.id,
|
|
84
|
+
e.passportId,
|
|
85
|
+
e.action,
|
|
86
|
+
e.actor,
|
|
87
|
+
e.timestamp,
|
|
88
|
+
e.platform ?? '',
|
|
89
|
+
(e.details ?? '').replace(/,/g, ';').replace(/\n/g, ' '),
|
|
90
|
+
]
|
|
91
|
+
.map((v) => `"${v}"`)
|
|
92
|
+
.join(','));
|
|
93
|
+
return [headers.join(','), ...rows].join('\n');
|
|
94
|
+
}
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Audit Statistics
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Get audit statistics for a passport
|
|
100
|
+
*/
|
|
101
|
+
export async function getAuditStats(vault, passportId) {
|
|
102
|
+
const entries = await getAuditLog(vault, passportId);
|
|
103
|
+
const byAction = {
|
|
104
|
+
created: 0,
|
|
105
|
+
viewed: 0,
|
|
106
|
+
shared: 0,
|
|
107
|
+
modified: 0,
|
|
108
|
+
revoked: 0,
|
|
109
|
+
renewed: 0,
|
|
110
|
+
accessed: 0,
|
|
111
|
+
'policy-checked': 0,
|
|
112
|
+
detected: 0,
|
|
113
|
+
exported: 0,
|
|
114
|
+
imported: 0,
|
|
115
|
+
};
|
|
116
|
+
const byActor = {};
|
|
117
|
+
const byPlatform = {};
|
|
118
|
+
const now = new Date();
|
|
119
|
+
const oneDayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000);
|
|
120
|
+
const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
|
|
121
|
+
let actionsLast24h = 0;
|
|
122
|
+
let actionsLast7d = 0;
|
|
123
|
+
let firstAction;
|
|
124
|
+
let lastAction;
|
|
125
|
+
let firstTimestamp = Infinity;
|
|
126
|
+
let lastTimestamp = -Infinity;
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
byAction[entry.action]++;
|
|
129
|
+
byActor[entry.actor] = (byActor[entry.actor] ?? 0) + 1;
|
|
130
|
+
if (entry.platform) {
|
|
131
|
+
byPlatform[entry.platform] = (byPlatform[entry.platform] ?? 0) + 1;
|
|
132
|
+
}
|
|
133
|
+
const entryDate = new Date(entry.timestamp);
|
|
134
|
+
if (entryDate >= oneDayAgo)
|
|
135
|
+
actionsLast24h++;
|
|
136
|
+
if (entryDate >= sevenDaysAgo)
|
|
137
|
+
actionsLast7d++;
|
|
138
|
+
const entryTime = new Date(entry.timestamp).getTime();
|
|
139
|
+
if (entryTime < firstTimestamp) {
|
|
140
|
+
firstTimestamp = entryTime;
|
|
141
|
+
firstAction = entry;
|
|
142
|
+
}
|
|
143
|
+
if (entryTime > lastTimestamp) {
|
|
144
|
+
lastTimestamp = entryTime;
|
|
145
|
+
lastAction = entry;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
totalActions: entries.length,
|
|
150
|
+
byAction,
|
|
151
|
+
byActor,
|
|
152
|
+
byPlatform,
|
|
153
|
+
firstAction,
|
|
154
|
+
lastAction,
|
|
155
|
+
actionsLast24h,
|
|
156
|
+
actionsLast7d,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Get recent activity across all passports
|
|
161
|
+
*/
|
|
162
|
+
export async function getRecentActivity(vault, limit = 20) {
|
|
163
|
+
return getAuditLog(vault, undefined, { limit });
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get access history for a specific passport
|
|
167
|
+
*/
|
|
168
|
+
export async function getAccessHistory(vault, passportId) {
|
|
169
|
+
return getAuditLog(vault, passportId, { action: 'accessed' });
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Check if a passport has been accessed recently
|
|
173
|
+
*/
|
|
174
|
+
export async function wasAccessedRecently(vault, passportId, withinMinutes = 5) {
|
|
175
|
+
const entries = await getAuditLog(vault, passportId, { action: 'accessed' });
|
|
176
|
+
if (entries.length === 0)
|
|
177
|
+
return false;
|
|
178
|
+
const mostRecent = entries[0];
|
|
179
|
+
if (!mostRecent)
|
|
180
|
+
return false;
|
|
181
|
+
const threshold = new Date(Date.now() - withinMinutes * 60 * 1000);
|
|
182
|
+
return new Date(mostRecent.timestamp) >= threshold;
|
|
183
|
+
}
|
|
184
|
+
// ============================================================================
|
|
185
|
+
// Audit Search
|
|
186
|
+
// ============================================================================
|
|
187
|
+
/**
|
|
188
|
+
* Search audit log by text in details
|
|
189
|
+
*/
|
|
190
|
+
export async function searchAuditLog(vault, searchTerm, passportId) {
|
|
191
|
+
const entries = await getAuditLog(vault, passportId);
|
|
192
|
+
const term = searchTerm.toLowerCase();
|
|
193
|
+
return entries.filter((e) => {
|
|
194
|
+
if (e.details?.toLowerCase().includes(term))
|
|
195
|
+
return true;
|
|
196
|
+
if (e.actor.toLowerCase().includes(term))
|
|
197
|
+
return true;
|
|
198
|
+
if (e.action.toLowerCase().includes(term))
|
|
199
|
+
return true;
|
|
200
|
+
if (e.platform?.toLowerCase().includes(term))
|
|
201
|
+
return true;
|
|
202
|
+
return false;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// ============================================================================
|
|
206
|
+
// Audit Alerting Helpers
|
|
207
|
+
// ============================================================================
|
|
208
|
+
/**
|
|
209
|
+
* Get suspicious activity patterns
|
|
210
|
+
* Returns entries that might indicate security concerns
|
|
211
|
+
*/
|
|
212
|
+
export async function getSuspiciousActivity(vault, passportId) {
|
|
213
|
+
const entries = await getAuditLog(vault, passportId);
|
|
214
|
+
const accessEntries = entries.filter((e) => e.action === 'accessed');
|
|
215
|
+
// Rapid access: multiple accesses within 1 minute
|
|
216
|
+
const rapidAccessSet = new Set();
|
|
217
|
+
const rapidAccess = [];
|
|
218
|
+
for (let i = 1; i < accessEntries.length; i++) {
|
|
219
|
+
const current = accessEntries[i];
|
|
220
|
+
const previous = accessEntries[i - 1];
|
|
221
|
+
if (current && previous) {
|
|
222
|
+
const timeDiff = new Date(previous.timestamp).getTime() - new Date(current.timestamp).getTime();
|
|
223
|
+
if (timeDiff < 60000) {
|
|
224
|
+
if (!rapidAccessSet.has(previous.id)) {
|
|
225
|
+
rapidAccessSet.add(previous.id);
|
|
226
|
+
rapidAccess.push(previous);
|
|
227
|
+
}
|
|
228
|
+
if (!rapidAccessSet.has(current.id)) {
|
|
229
|
+
rapidAccessSet.add(current.id);
|
|
230
|
+
rapidAccess.push(current);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Unusual actors: actors that appear only once
|
|
236
|
+
const actorCounts = {};
|
|
237
|
+
for (const entry of accessEntries) {
|
|
238
|
+
actorCounts[entry.actor] = (actorCounts[entry.actor] ?? 0) + 1;
|
|
239
|
+
}
|
|
240
|
+
const unusualActors = accessEntries.filter((e) => actorCounts[e.actor] === 1);
|
|
241
|
+
// After hours access (between 10 PM and 6 AM)
|
|
242
|
+
const afterHoursAccess = accessEntries.filter((e) => {
|
|
243
|
+
const hour = new Date(e.timestamp).getHours();
|
|
244
|
+
return hour >= 22 || hour < 6;
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
rapidAccess,
|
|
248
|
+
unusualActors,
|
|
249
|
+
afterHoursAccess,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Auth Module
|
|
3
|
+
* Secure passphrase resolution and session token management.
|
|
4
|
+
*/
|
|
5
|
+
export { PassphraseProvider, type PassphraseProviderOptions, type PassphraseSource, type PassphraseResult, } from './passphraseProvider.js';
|
|
6
|
+
export { SessionTokenManager, SESSION_TOKEN_ENV_VAR, type SidecarEntry, type SidecarFile, type TokenInfo, } from './sessionTokenManager.js';
|
|
7
|
+
export { KeychainProvider } from './keychainProvider.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Auth Module
|
|
3
|
+
* Secure passphrase resolution and session token management.
|
|
4
|
+
*/
|
|
5
|
+
export { PassphraseProvider, } from './passphraseProvider.js';
|
|
6
|
+
export { SessionTokenManager, SESSION_TOKEN_ENV_VAR, } from './sessionTokenManager.js';
|
|
7
|
+
export { KeychainProvider } from './keychainProvider.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,GAInB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAItB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ID Wispera Keychain Provider
|
|
3
|
+
* Optional OS keychain integration for secure passphrase storage.
|
|
4
|
+
*
|
|
5
|
+
* Uses `keytar` when available (macOS Keychain, Windows Credential Manager,
|
|
6
|
+
* Linux Secret Service). Degrades gracefully — returns null if keytar is
|
|
7
|
+
* not installed or the OS keychain is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Thin wrapper around the OS keychain. Every public method catches import
|
|
11
|
+
* and runtime errors so callers never need to know whether keytar is present.
|
|
12
|
+
*/
|
|
13
|
+
export declare class KeychainProvider {
|
|
14
|
+
private keytar;
|
|
15
|
+
private loadAttempted;
|
|
16
|
+
/**
|
|
17
|
+
* Lazily try to load keytar. Called once — result is cached.
|
|
18
|
+
*/
|
|
19
|
+
private loadKeytar;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the keychain backend is available on this system.
|
|
22
|
+
*/
|
|
23
|
+
isAvailable(): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Store the vault passphrase in the OS keychain.
|
|
26
|
+
* Returns `true` on success, `false` if the keychain is unavailable.
|
|
27
|
+
*/
|
|
28
|
+
store(passphrase: string): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieve the vault passphrase from the OS keychain.
|
|
31
|
+
* Returns `null` if unavailable or no entry exists.
|
|
32
|
+
*/
|
|
33
|
+
retrieve(): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Remove the vault passphrase from the OS keychain.
|
|
36
|
+
* Returns `true` if deleted, `false` if unavailable or nothing to delete.
|
|
37
|
+
*/
|
|
38
|
+
remove(): Promise<boolean>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=keychainProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychainProvider.d.ts","sourceRoot":"","sources":["../../src/auth/keychainProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,aAAa,CAAS;IAE9B;;OAEG;YACW,UAAU;IAaxB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAcrC;;;OAGG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYjD;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAWxC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CAUjC"}
|