@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.
Files changed (154) hide show
  1. package/README.md +268 -0
  2. package/dist/audit.d.ts +68 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +252 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/auth/index.d.ts +8 -0
  7. package/dist/auth/index.d.ts.map +1 -0
  8. package/dist/auth/index.js +8 -0
  9. package/dist/auth/index.js.map +1 -0
  10. package/dist/auth/keychainProvider.d.ts +40 -0
  11. package/dist/auth/keychainProvider.d.ts.map +1 -0
  12. package/dist/auth/keychainProvider.js +98 -0
  13. package/dist/auth/keychainProvider.js.map +1 -0
  14. package/dist/auth/passphraseProvider.d.ts +80 -0
  15. package/dist/auth/passphraseProvider.d.ts.map +1 -0
  16. package/dist/auth/passphraseProvider.js +188 -0
  17. package/dist/auth/passphraseProvider.js.map +1 -0
  18. package/dist/auth/sessionTokenManager.d.ts +106 -0
  19. package/dist/auth/sessionTokenManager.d.ts.map +1 -0
  20. package/dist/auth/sessionTokenManager.js +263 -0
  21. package/dist/auth/sessionTokenManager.js.map +1 -0
  22. package/dist/delegation.d.ts +81 -0
  23. package/dist/delegation.d.ts.map +1 -0
  24. package/dist/delegation.js +299 -0
  25. package/dist/delegation.js.map +1 -0
  26. package/dist/detection.d.ts +35 -0
  27. package/dist/detection.d.ts.map +1 -0
  28. package/dist/detection.js +474 -0
  29. package/dist/detection.js.map +1 -0
  30. package/dist/exec/execManager.d.ts +60 -0
  31. package/dist/exec/execManager.d.ts.map +1 -0
  32. package/dist/exec/execManager.js +226 -0
  33. package/dist/exec/execManager.js.map +1 -0
  34. package/dist/exec/index.d.ts +6 -0
  35. package/dist/exec/index.d.ts.map +1 -0
  36. package/dist/exec/index.js +5 -0
  37. package/dist/exec/index.js.map +1 -0
  38. package/dist/index.d.ts +35 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +98 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/integrations/base.d.ts +64 -0
  43. package/dist/integrations/base.d.ts.map +1 -0
  44. package/dist/integrations/base.js +173 -0
  45. package/dist/integrations/base.js.map +1 -0
  46. package/dist/integrations/envMapping.d.ts +47 -0
  47. package/dist/integrations/envMapping.d.ts.map +1 -0
  48. package/dist/integrations/envMapping.js +174 -0
  49. package/dist/integrations/envMapping.js.map +1 -0
  50. package/dist/integrations/google-a2a.d.ts +48 -0
  51. package/dist/integrations/google-a2a.d.ts.map +1 -0
  52. package/dist/integrations/google-a2a.js +108 -0
  53. package/dist/integrations/google-a2a.js.map +1 -0
  54. package/dist/integrations/index.d.ts +14 -0
  55. package/dist/integrations/index.d.ts.map +1 -0
  56. package/dist/integrations/index.js +14 -0
  57. package/dist/integrations/index.js.map +1 -0
  58. package/dist/integrations/langchain.d.ts +38 -0
  59. package/dist/integrations/langchain.d.ts.map +1 -0
  60. package/dist/integrations/langchain.js +45 -0
  61. package/dist/integrations/langchain.js.map +1 -0
  62. package/dist/integrations/openai-agents.d.ts +76 -0
  63. package/dist/integrations/openai-agents.d.ts.map +1 -0
  64. package/dist/integrations/openai-agents.js +95 -0
  65. package/dist/integrations/openai-agents.js.map +1 -0
  66. package/dist/integrations/slack.d.ts +59 -0
  67. package/dist/integrations/slack.d.ts.map +1 -0
  68. package/dist/integrations/slack.js +113 -0
  69. package/dist/integrations/slack.js.map +1 -0
  70. package/dist/integrations/types.d.ts +107 -0
  71. package/dist/integrations/types.d.ts.map +1 -0
  72. package/dist/integrations/types.js +6 -0
  73. package/dist/integrations/types.js.map +1 -0
  74. package/dist/locations.d.ts +157 -0
  75. package/dist/locations.d.ts.map +1 -0
  76. package/dist/locations.js +733 -0
  77. package/dist/locations.js.map +1 -0
  78. package/dist/passport.d.ts +70 -0
  79. package/dist/passport.d.ts.map +1 -0
  80. package/dist/passport.js +429 -0
  81. package/dist/passport.js.map +1 -0
  82. package/dist/policy.d.ts +80 -0
  83. package/dist/policy.d.ts.map +1 -0
  84. package/dist/policy.js +392 -0
  85. package/dist/policy.js.map +1 -0
  86. package/dist/providers/openclaw.d.ts +80 -0
  87. package/dist/providers/openclaw.d.ts.map +1 -0
  88. package/dist/providers/openclaw.js +712 -0
  89. package/dist/providers/openclaw.js.map +1 -0
  90. package/dist/provisioning/adminPassport.d.ts +51 -0
  91. package/dist/provisioning/adminPassport.d.ts.map +1 -0
  92. package/dist/provisioning/adminPassport.js +101 -0
  93. package/dist/provisioning/adminPassport.js.map +1 -0
  94. package/dist/provisioning/index.d.ts +81 -0
  95. package/dist/provisioning/index.d.ts.map +1 -0
  96. package/dist/provisioning/index.js +141 -0
  97. package/dist/provisioning/index.js.map +1 -0
  98. package/dist/provisioning/provider.d.ts +59 -0
  99. package/dist/provisioning/provider.d.ts.map +1 -0
  100. package/dist/provisioning/provider.js +52 -0
  101. package/dist/provisioning/provider.js.map +1 -0
  102. package/dist/provisioning/providers/anthropic.d.ts +32 -0
  103. package/dist/provisioning/providers/anthropic.d.ts.map +1 -0
  104. package/dist/provisioning/providers/anthropic.js +116 -0
  105. package/dist/provisioning/providers/anthropic.js.map +1 -0
  106. package/dist/provisioning/providers/aws.d.ts +29 -0
  107. package/dist/provisioning/providers/aws.d.ts.map +1 -0
  108. package/dist/provisioning/providers/aws.js +455 -0
  109. package/dist/provisioning/providers/aws.js.map +1 -0
  110. package/dist/provisioning/providers/azure-entra.d.ts +32 -0
  111. package/dist/provisioning/providers/azure-entra.d.ts.map +1 -0
  112. package/dist/provisioning/providers/azure-entra.js +312 -0
  113. package/dist/provisioning/providers/azure-entra.js.map +1 -0
  114. package/dist/provisioning/providers/github.d.ts +24 -0
  115. package/dist/provisioning/providers/github.d.ts.map +1 -0
  116. package/dist/provisioning/providers/github.js +219 -0
  117. package/dist/provisioning/providers/github.js.map +1 -0
  118. package/dist/provisioning/providers/google-cloud.d.ts +34 -0
  119. package/dist/provisioning/providers/google-cloud.d.ts.map +1 -0
  120. package/dist/provisioning/providers/google-cloud.js +366 -0
  121. package/dist/provisioning/providers/google-cloud.js.map +1 -0
  122. package/dist/provisioning/providers/openai.d.ts +29 -0
  123. package/dist/provisioning/providers/openai.d.ts.map +1 -0
  124. package/dist/provisioning/providers/openai.js +263 -0
  125. package/dist/provisioning/providers/openai.js.map +1 -0
  126. package/dist/provisioning/providers/sendgrid.d.ts +27 -0
  127. package/dist/provisioning/providers/sendgrid.d.ts.map +1 -0
  128. package/dist/provisioning/providers/sendgrid.js +186 -0
  129. package/dist/provisioning/providers/sendgrid.js.map +1 -0
  130. package/dist/provisioning/providers/twilio.d.ts +27 -0
  131. package/dist/provisioning/providers/twilio.d.ts.map +1 -0
  132. package/dist/provisioning/providers/twilio.js +194 -0
  133. package/dist/provisioning/providers/twilio.js.map +1 -0
  134. package/dist/provisioning/types.d.ts +274 -0
  135. package/dist/provisioning/types.d.ts.map +1 -0
  136. package/dist/provisioning/types.js +6 -0
  137. package/dist/provisioning/types.js.map +1 -0
  138. package/dist/sharing.d.ts +60 -0
  139. package/dist/sharing.d.ts.map +1 -0
  140. package/dist/sharing.js +305 -0
  141. package/dist/sharing.js.map +1 -0
  142. package/dist/types.d.ts +396 -0
  143. package/dist/types.d.ts.map +1 -0
  144. package/dist/types.js +88 -0
  145. package/dist/types.js.map +1 -0
  146. package/dist/utils.d.ts +45 -0
  147. package/dist/utils.d.ts.map +1 -0
  148. package/dist/utils.js +110 -0
  149. package/dist/utils.js.map +1 -0
  150. package/dist/vault.d.ts +151 -0
  151. package/dist/vault.d.ts.map +1 -0
  152. package/dist/vault.js +499 -0
  153. package/dist/vault.js.map +1 -0
  154. 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
@@ -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"}