@agentimprint/sdk 0.1.0 → 0.1.2

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 CHANGED
@@ -13,31 +13,45 @@ npm install @agentimprint/sdk
13
13
  ```typescript
14
14
  import { ImprintClient } from '@agentimprint/sdk';
15
15
 
16
- const client = new ImprintClient({
17
- apiKey: 'your-api-key',
18
- baseUrl: 'https://agentimprint.ai/api/v1',
16
+ // baseUrl defaults to https://api.agentimprint.io.
17
+ // Override it for self-hosting, but do NOT include /api/v1 — the SDK appends it.
18
+ const client = new ImprintClient({ apiKey: process.env.IMPRINT_API_KEY! });
19
+
20
+ // Register an agent (required before you can create a vault)
21
+ const agent = await client.agents.create({
22
+ name: 'my-assistant',
23
+ model_family: 'claude',
24
+ core_purpose: 'Personal task management assistant',
25
+ creator_identifier: 'you@example.com',
19
26
  });
20
27
 
21
- // Create a vault
28
+ // Create a vault for that agent
22
29
  const vault = await client.vaults.create({
23
30
  name: 'my-agent-memory',
31
+ agent_uuid: agent.uuid,
24
32
  description: 'Persistent memory for my AI agent',
25
33
  });
26
34
 
27
- // Store a memory
28
- await client.entries.create(vault.id, {
29
- type: 'lesson',
30
- content: 'User prefers concise responses over verbose explanations',
35
+ // Store a memory — `content` is a typed object whose fields depend on entry_type
36
+ await client.entries.create(vault.uuid, {
37
+ entry_type: 'lesson',
38
+ content: {
39
+ summary: 'User prefers concise responses over verbose explanations',
40
+ context: 'Said "keep it short" repeatedly',
41
+ learned_from: 'direct feedback',
42
+ },
31
43
  confidence: 0.9,
32
44
  tags: ['preferences', 'communication'],
33
45
  });
34
46
 
35
- // Search memories
36
- const results = await client.entries.search(vault.id, {
37
- query: 'user preferences',
38
- });
47
+ // Search / list memories (filter by type, tag, or free-text q)
48
+ const { entries } = await client.entries.list(vault.uuid, { q: 'user preferences' });
39
49
  ```
40
50
 
51
+ > Each `entry_type` has its own required `content` fields (e.g. `lesson` ⇒
52
+ > `summary` / `context` / `learned_from`, `fact` ⇒ `statement` / `source` / `verified`).
53
+ > See the [ImprintML spec](https://agentimprint.ai/docs) for the full per-type schema.
54
+
41
55
  ## Features
42
56
 
43
57
  - **Vault Management** — Create, read, update encrypted memory vaults
@@ -65,15 +79,27 @@ ImprintML supports these memory types:
65
79
 
66
80
  ## Encryption
67
81
 
68
- All vault contents can be encrypted client-side before transmission:
82
+ Encrypt sensitive entries client-side the server only ever sees ciphertext.
83
+ The crypto helpers are standalone functions (no class). `generateKey()` is
84
+ synchronous and returns a hex string; `encrypt`/`decrypt` operate on objects:
69
85
 
70
86
  ```typescript
71
- import { ImprintCrypto } from '@agentimprint/sdk';
87
+ import { generateKey, deriveVaultKey, encrypt, decrypt } from '@agentimprint/sdk';
88
+
89
+ const masterKey = generateKey(); // hex string — store securely
90
+ const vaultKey = await deriveVaultKey(masterKey, vault.uuid); // HKDF, per-vault
91
+
92
+ // Encrypt an object and store it as an encrypted entry
93
+ const payload = await encrypt(vaultKey, { ssn: '***-**-1234' });
94
+ const entry = await client.entries.create(vault.uuid, {
95
+ entry_type: 'fact',
96
+ content: payload,
97
+ is_encrypted: true,
98
+ });
72
99
 
73
- const crypto = new ImprintCrypto();
74
- const key = await crypto.generateKey();
75
- const encrypted = await crypto.encrypt(key, 'sensitive memory data');
76
- const decrypted = await crypto.decrypt(key, encrypted);
100
+ // Later: fetch and decrypt back into the original object
101
+ const fetched = await client.entries.get(vault.uuid, entry.uuid);
102
+ const data = await decrypt(vaultKey, fetched.content); // -> { ssn: '***-**-1234' }
77
103
  ```
78
104
 
79
105
  ## Documentation
package/dist/index.cjs CHANGED
@@ -174,11 +174,13 @@ var EntriesResource = class {
174
174
  return response.data;
175
175
  }
176
176
  async createBulk(vaultUuid, entries) {
177
- const response = await this.http.post(
178
- `/api/v1/vaults/${vaultUuid}/entries/bulk`,
179
- { entries }
180
- );
181
- return response.data;
177
+ const response = await this.http.post(`/api/v1/vaults/${vaultUuid}/entries/bulk`, { entries });
178
+ const d = response.data;
179
+ return {
180
+ imported: d.created.map((e) => e.uuid),
181
+ failed: d.failed,
182
+ summary: { total: d.summary.total, imported: d.summary.created, failed: d.summary.failed }
183
+ };
182
184
  }
183
185
  async get(vaultUuid, entryUuid) {
184
186
  const response = await this.http.get(
@@ -209,7 +211,8 @@ var OrganizationsResource = class {
209
211
  { name },
210
212
  false
211
213
  );
212
- return { ...response.data, apiKey: response.api_key };
214
+ const { api_key, ...organization } = response.data;
215
+ return { ...organization, apiKey: api_key };
213
216
  }
214
217
  async get(uuid) {
215
218
  const response = await this.http.get(`/api/v1/organizations/${uuid}`);
@@ -218,6 +221,16 @@ var OrganizationsResource = class {
218
221
  };
219
222
 
220
223
  // src/resources/vaults.ts
224
+ function mapSnapshot(s, vaultUuid) {
225
+ return {
226
+ uuid: s.snapshot_uuid ?? s.uuid ?? "",
227
+ vault_uuid: vaultUuid,
228
+ root_hash: s.merkle_root ?? s.root_hash ?? "",
229
+ entry_count: s.entry_count ?? 0,
230
+ storage_bytes: s.storage_bytes ?? 0,
231
+ created_at: s.created_at ?? ""
232
+ };
233
+ }
221
234
  var VaultsResource = class {
222
235
  constructor(http) {
223
236
  this.http = http;
@@ -254,20 +267,27 @@ var VaultsResource = class {
254
267
  return response.data;
255
268
  }
256
269
  async verify(uuid) {
257
- const response = await this.http.post(
258
- `/api/v1/vaults/${uuid}/verify`
259
- );
260
- return response.data;
270
+ const response = await this.http.post(`/api/v1/vaults/${uuid}/verify`);
271
+ const d = response.data;
272
+ return {
273
+ valid: d.is_valid,
274
+ vault_uuid: d.vault_uuid,
275
+ root_hash: d.computed_root,
276
+ stored_root: d.stored_root,
277
+ entry_count: d.entry_count
278
+ };
261
279
  }
262
280
  async snapshot(uuid) {
263
281
  const response = await this.http.post(
264
282
  `/api/v1/vaults/${uuid}/snapshot`
265
283
  );
266
- return response.data;
284
+ return mapSnapshot(response.data, uuid);
267
285
  }
268
286
  async snapshots(uuid) {
269
- const response = await this.http.get(`/api/v1/vaults/${uuid}/snapshots`);
270
- return response.data;
287
+ const response = await this.http.get(
288
+ `/api/v1/vaults/${uuid}/snapshots`
289
+ );
290
+ return (response.data ?? []).map((s) => mapSnapshot(s, uuid));
271
291
  }
272
292
  };
273
293
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/entries.ts","../src/resources/organizations.ts","../src/resources/vaults.ts","../src/client.ts","../src/fingerprint.ts","../src/crypto.ts"],"names":["getCrypto"],"mappings":"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","file":"index.cjs","sourcesContent":["// ============================================================\n// Agent Imprint SDK — Typed Errors\n// ============================================================\n\nexport class ImprintApiError extends Error {\n public readonly status: number;\n public readonly code: string | undefined;\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n body?: unknown,\n code?: string,\n ) {\n super(message);\n this.name = 'ImprintApiError';\n this.status = status;\n this.code = code;\n this.body = body;\n Object.setPrototypeOf(this, ImprintApiError.prototype);\n }\n}\n\nexport class ImprintValidationError extends ImprintApiError {\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]>,\n body?: unknown,\n ) {\n super(message, 422, body, 'VALIDATION_ERROR');\n this.name = 'ImprintValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ImprintValidationError.prototype);\n }\n}\n\nexport class ImprintAuthError extends ImprintApiError {\n constructor(message: string = 'Unauthorized — check your API key', body?: unknown) {\n super(message, 401, body, 'AUTH_ERROR');\n this.name = 'ImprintAuthError';\n Object.setPrototypeOf(this, ImprintAuthError.prototype);\n }\n}\n\nexport class ImprintNotFoundError extends ImprintApiError {\n constructor(message: string = 'Resource not found', body?: unknown) {\n super(message, 404, body, 'NOT_FOUND');\n this.name = 'ImprintNotFoundError';\n Object.setPrototypeOf(this, ImprintNotFoundError.prototype);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — HTTP Transport\n// ============================================================\n\nimport {\n ImprintApiError,\n ImprintAuthError,\n ImprintNotFoundError,\n ImprintValidationError,\n} from './errors.js';\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(apiKey: string, baseUrl: string) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n requiresAuth?: boolean;\n } = {},\n ): Promise<T> {\n const { body, params, requiresAuth = true } = options;\n const url = this.buildUrl(path, params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n\n if (requiresAuth) {\n headers['X-API-Key'] = this.apiKey;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n await this.throwError(response.status, responseBody);\n }\n\n return responseBody as T;\n }\n\n private async throwError(status: number, body: unknown): Promise<never> {\n const bodyObj = typeof body === 'object' && body !== null ? body as Record<string, unknown> : {};\n const message = typeof bodyObj['message'] === 'string' ? bodyObj['message'] : `HTTP ${status}`;\n\n switch (status) {\n case 401:\n throw new ImprintAuthError(message, body);\n case 404:\n throw new ImprintNotFoundError(message, body);\n case 422: {\n const errors = (bodyObj['errors'] as Record<string, string[]>) ?? {};\n throw new ImprintValidationError(message, errors, body);\n }\n default:\n throw new ImprintApiError(message, status, body);\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, requiresAuth = true): Promise<T> {\n return this.request<T>('GET', path, { params, requiresAuth });\n }\n\n async post<T>(path: string, body?: unknown, requiresAuth = true): Promise<T> {\n return this.request<T>('POST', path, { body, requiresAuth });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Agent,\n CreateAgentParams,\n DiscoverResult,\n GenerateKeyResult,\n RecoverKeyResult,\n SplitKeyParams,\n SplitKeyResult,\n} from '../types.js';\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateAgentParams): Promise<Agent> {\n const response = await this.http.post<{ data: Agent }>('/api/v1/agents', params);\n return response.data;\n }\n\n async list(): Promise<Agent[]> {\n const response = await this.http.get<{ data: Agent[] }>('/api/v1/agents');\n return response.data;\n }\n\n async get(uuid: string): Promise<Agent> {\n const response = await this.http.get<{ data: Agent }>(`/api/v1/agents/${uuid}`);\n return response.data;\n }\n\n async discover(fingerprint: string): Promise<DiscoverResult> {\n const response = await this.http.get<{ data: DiscoverResult }>(\n `/api/v1/agents/discover/${fingerprint}`,\n );\n return response.data;\n }\n\n async generateKey(uuid: string): Promise<GenerateKeyResult> {\n const response = await this.http.post<{ data: GenerateKeyResult }>(\n `/api/v1/agents/${uuid}/keys/generate`,\n );\n return response.data;\n }\n\n async splitKey(uuid: string, params: SplitKeyParams): Promise<SplitKeyResult> {\n const response = await this.http.post<{ data: SplitKeyResult }>(\n `/api/v1/agents/${uuid}/keys/split`,\n params,\n );\n return response.data;\n }\n\n async recoverKey(uuid: string, shares: string[]): Promise<RecoverKeyResult> {\n const response = await this.http.post<{ data: RecoverKeyResult }>(\n `/api/v1/agents/${uuid}/keys/recover`,\n { shares },\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n BulkResult,\n CreateEntryParams,\n Entry,\n ListEntriesParams,\n PaginatedEntries,\n UpdateEntryParams,\n} from '../types.js';\n\nexport class EntriesResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(vaultUuid: string, params?: ListEntriesParams): Promise<PaginatedEntries> {\n const response = await this.http.get<{ data: Entry[]; meta: Record<string, unknown> }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n params as Record<string, string | number | boolean | undefined>,\n );\n const pagination = (response.meta?.pagination ?? {}) as PaginatedEntries['pagination'];\n return { entries: response.data, pagination };\n }\n\n async create(vaultUuid: string, entry: CreateEntryParams): Promise<Entry> {\n const response = await this.http.post<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n entry,\n );\n return response.data;\n }\n\n async createBulk(vaultUuid: string, entries: CreateEntryParams[]): Promise<BulkResult> {\n const response = await this.http.post<{ data: BulkResult }>(\n `/api/v1/vaults/${vaultUuid}/entries/bulk`,\n { entries },\n );\n return response.data;\n }\n\n async get(vaultUuid: string, entryUuid: string): Promise<Entry> {\n const response = await this.http.get<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n );\n return response.data;\n }\n\n async update(vaultUuid: string, entryUuid: string, data: UpdateEntryParams): Promise<Entry> {\n const response = await this.http.put<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n data,\n );\n return response.data;\n }\n\n async delete(vaultUuid: string, entryUuid: string): Promise<void> {\n await this.http.delete<void>(`/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Organization, OrganizationWithKey } from '../types.js';\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(name: string): Promise<OrganizationWithKey> {\n const response = await this.http.post<{ data: Organization; api_key: string }>(\n '/api/v1/organizations',\n { name },\n false,\n );\n return { ...response.data, apiKey: response.api_key };\n }\n\n async get(uuid: string): Promise<Organization> {\n const response = await this.http.get<{ data: Organization }>(`/api/v1/organizations/${uuid}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n CreateVaultParams,\n ImportResult,\n MerkleInfo,\n Snapshot,\n Vault,\n VaultExport,\n VaultStats,\n VerifyResult,\n} from '../types.js';\n\nexport class VaultsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateVaultParams): Promise<Vault> {\n const response = await this.http.post<{ data: Vault }>('/api/v1/vaults', params);\n return response.data;\n }\n\n async list(): Promise<Vault[]> {\n const response = await this.http.get<{ data: Vault[] }>('/api/v1/vaults');\n return response.data;\n }\n\n async get(uuid: string): Promise<Vault> {\n const response = await this.http.get<{ data: Vault }>(`/api/v1/vaults/${uuid}`);\n return response.data;\n }\n\n async stats(uuid: string): Promise<VaultStats> {\n const response = await this.http.get<{ data: VaultStats }>(`/api/v1/vaults/${uuid}/stats`);\n return response.data;\n }\n\n async export(uuid: string): Promise<VaultExport> {\n const response = await this.http.get<{ data: VaultExport }>(`/api/v1/vaults/${uuid}/export`);\n return response.data;\n }\n\n async import(uuid: string, data: VaultExport): Promise<ImportResult> {\n const response = await this.http.post<{ data: ImportResult }>(\n `/api/v1/vaults/${uuid}/import`,\n data,\n );\n return response.data;\n }\n\n async merkle(uuid: string): Promise<MerkleInfo> {\n const response = await this.http.get<{ data: MerkleInfo }>(`/api/v1/vaults/${uuid}/merkle`);\n return response.data;\n }\n\n async verify(uuid: string): Promise<VerifyResult> {\n const response = await this.http.post<{ data: VerifyResult }>(\n `/api/v1/vaults/${uuid}/verify`,\n );\n return response.data;\n }\n\n async snapshot(uuid: string): Promise<Snapshot> {\n const response = await this.http.post<{ data: Snapshot }>(\n `/api/v1/vaults/${uuid}/snapshot`,\n );\n return response.data;\n }\n\n async snapshots(uuid: string): Promise<Snapshot[]> {\n const response = await this.http.get<{ data: Snapshot[] }>(`/api/v1/vaults/${uuid}/snapshots`);\n return response.data;\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Main Client\n// ============================================================\n\nimport { HttpClient } from './http.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { EntriesResource } from './resources/entries.js';\nimport { OrganizationsResource } from './resources/organizations.js';\nimport { VaultsResource } from './resources/vaults.js';\nimport type { ImprintClientConfig } from './types.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.agentimprint.io';\n\n/**\n * ImprintClient — main entry point for the Agent Imprint SDK.\n *\n * @example\n * ```ts\n * const client = new ImprintClient({ apiKey: 'your-api-key' });\n * const agents = await client.agents.list();\n * ```\n */\nexport class ImprintClient {\n public readonly organizations: OrganizationsResource;\n public readonly agents: AgentsResource;\n public readonly vaults: VaultsResource;\n public readonly entries: EntriesResource;\n\n private readonly http: HttpClient;\n\n /**\n * Public discovery — check if an agent fingerprint exists (no auth required).\n * Uses the unauthenticated /api/v1/discover endpoint.\n */\n static async probe(fingerprint: string, baseUrl?: string): Promise<{ exists: boolean }> {\n const url = (baseUrl ?? DEFAULT_BASE_URL) + '/api/v1/discover/' + encodeURIComponent(fingerprint);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Discovery probe failed: ' + response.status);\n }\n const json = await response.json() as { data: { exists: boolean } };\n return json.data;\n }\n\n constructor(config: ImprintClientConfig) {\n if (!config.apiKey) {\n throw new Error('ImprintClient: apiKey is required');\n }\n\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.http = new HttpClient(config.apiKey, baseUrl);\n\n this.organizations = new OrganizationsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.vaults = new VaultsResource(this.http);\n this.entries = new EntriesResource(this.http);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Fingerprint Helper\n// Matches server-side algorithm:\n// sha256(model_family + sha256(core_purpose) + creator_identifier)\n// ============================================================\n\nimport type { FingerprintComponents } from './types.js';\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hashBuffer = await getCrypto().subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Compute a deterministic agent fingerprint that matches the server-side algorithm.\n *\n * Algorithm: sha256(model_family + sha256(core_purpose) + creator_identifier)\n */\nexport async function computeFingerprint(params: FingerprintComponents): Promise<string> {\n const { model_family, core_purpose, creator_identifier } = params;\n const purposeHash = await sha256Hex(core_purpose);\n const combined = `${model_family}${purposeHash}${creator_identifier}`;\n return sha256Hex(combined);\n}\n","// ============================================================\n// Agent Imprint SDK — Encryption Helpers (Web Crypto API)\n// Works in Node.js 18+ (globalThis.crypto) and browsers\n// ============================================================\n\nimport type { EncryptedPayload } from './types.js';\n\nconst ALGORITHM = 'AES-GCM';\nconst KEY_LENGTH = 256;\nconst IV_LENGTH = 12; // 96-bit IV for AES-GCM\n\n// ─── Utility ───────────────────────────────────────────────\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function importAesKey(keyHex: string, usages: KeyUsage[]): Promise<CryptoKey> {\n const keyBytes = hexToBytes(keyHex);\n return getCrypto().subtle.importKey('raw', toArrayBuffer(keyBytes), { name: ALGORITHM }, false, usages);\n}\n\n// ─── HKDF Key Derivation ───────────────────────────────────\n\nasync function hkdfDerive(masterKeyHex: string, info: string): Promise<string> {\n const crypto = getCrypto();\n const masterKeyBytes = hexToBytes(masterKeyHex);\n\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n toArrayBuffer(masterKeyBytes),\n { name: 'HKDF' },\n false,\n ['deriveKey'],\n );\n\n const infoBytes = new TextEncoder().encode(info);\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: new Uint8Array(32),\n info: infoBytes,\n },\n baseKey,\n { name: ALGORITHM, length: KEY_LENGTH },\n true,\n ['encrypt', 'decrypt'],\n );\n\n const exported = await crypto.subtle.exportKey('raw', derivedKey);\n return bytesToHex(new Uint8Array(exported));\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Generate a cryptographically secure random 256-bit key (64 hex chars).\n */\nexport function generateKey(): string {\n const bytes = new Uint8Array(32);\n getCrypto().getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\n/**\n * Derive a vault-specific key from a master key and vault UUID.\n */\nexport async function deriveVaultKey(masterKey: string, vaultUuid: string): Promise<string> {\n return hkdfDerive(masterKey, `vault:${vaultUuid}`);\n}\n\n/**\n * Derive an entry-specific key from a vault key and entry UUID.\n */\nexport async function deriveEntryKey(vaultKey: string, entryUuid: string): Promise<string> {\n return hkdfDerive(vaultKey, `entry:${entryUuid}`);\n}\n\n/**\n * Encrypt a JSON-serializable object with AES-256-GCM.\n * Returns an EncryptedPayload with ciphertext, iv, and tag (all hex-encoded).\n */\nexport async function encrypt(keyHex: string, data: object): Promise<EncryptedPayload> {\n const crypto = getCrypto();\n const cryptoKey = await importAesKey(keyHex, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const plaintext = new TextEncoder().encode(JSON.stringify(data));\n\n const ciphertextWithTag = await crypto.subtle.encrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n\n // AES-GCM appends the 16-byte auth tag at the end\n const ciphertextWithTagBytes = new Uint8Array(ciphertextWithTag);\n const ciphertext = ciphertextWithTagBytes.slice(0, -16);\n const tag = ciphertextWithTagBytes.slice(-16);\n\n return {\n ciphertext: bytesToHex(ciphertext),\n iv: bytesToHex(iv),\n tag: bytesToHex(tag),\n algorithm: 'AES-256-GCM',\n };\n}\n\n/**\n * Decrypt an EncryptedPayload back to the original object.\n */\nexport async function decrypt(keyHex: string, payload: EncryptedPayload): Promise<object> {\n const cryptoKey = await importAesKey(keyHex, ['decrypt']);\n const iv = hexToBytes(payload.iv);\n const ciphertext = hexToBytes(payload.ciphertext);\n const tag = hexToBytes(payload.tag);\n\n // Reassemble ciphertext + tag for AES-GCM\n const combined = new Uint8Array(ciphertext.length + tag.length);\n combined.set(ciphertext);\n combined.set(tag, ciphertext.length);\n\n const plaintext = await getCrypto().subtle.decrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(combined),\n );\n\n return JSON.parse(new TextDecoder().decode(plaintext)) as object;\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/entries.ts","../src/resources/organizations.ts","../src/resources/vaults.ts","../src/client.ts","../src/fingerprint.ts","../src/crypto.ts"],"names":["getCrypto"],"mappings":"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","file":"index.cjs","sourcesContent":["// ============================================================\n// Agent Imprint SDK — Typed Errors\n// ============================================================\n\nexport class ImprintApiError extends Error {\n public readonly status: number;\n public readonly code: string | undefined;\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n body?: unknown,\n code?: string,\n ) {\n super(message);\n this.name = 'ImprintApiError';\n this.status = status;\n this.code = code;\n this.body = body;\n Object.setPrototypeOf(this, ImprintApiError.prototype);\n }\n}\n\nexport class ImprintValidationError extends ImprintApiError {\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]>,\n body?: unknown,\n ) {\n super(message, 422, body, 'VALIDATION_ERROR');\n this.name = 'ImprintValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ImprintValidationError.prototype);\n }\n}\n\nexport class ImprintAuthError extends ImprintApiError {\n constructor(message: string = 'Unauthorized — check your API key', body?: unknown) {\n super(message, 401, body, 'AUTH_ERROR');\n this.name = 'ImprintAuthError';\n Object.setPrototypeOf(this, ImprintAuthError.prototype);\n }\n}\n\nexport class ImprintNotFoundError extends ImprintApiError {\n constructor(message: string = 'Resource not found', body?: unknown) {\n super(message, 404, body, 'NOT_FOUND');\n this.name = 'ImprintNotFoundError';\n Object.setPrototypeOf(this, ImprintNotFoundError.prototype);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — HTTP Transport\n// ============================================================\n\nimport {\n ImprintApiError,\n ImprintAuthError,\n ImprintNotFoundError,\n ImprintValidationError,\n} from './errors.js';\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(apiKey: string, baseUrl: string) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n requiresAuth?: boolean;\n } = {},\n ): Promise<T> {\n const { body, params, requiresAuth = true } = options;\n const url = this.buildUrl(path, params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n\n if (requiresAuth) {\n headers['X-API-Key'] = this.apiKey;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n await this.throwError(response.status, responseBody);\n }\n\n return responseBody as T;\n }\n\n private async throwError(status: number, body: unknown): Promise<never> {\n const bodyObj = typeof body === 'object' && body !== null ? body as Record<string, unknown> : {};\n const message = typeof bodyObj['message'] === 'string' ? bodyObj['message'] : `HTTP ${status}`;\n\n switch (status) {\n case 401:\n throw new ImprintAuthError(message, body);\n case 404:\n throw new ImprintNotFoundError(message, body);\n case 422: {\n const errors = (bodyObj['errors'] as Record<string, string[]>) ?? {};\n throw new ImprintValidationError(message, errors, body);\n }\n default:\n throw new ImprintApiError(message, status, body);\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, requiresAuth = true): Promise<T> {\n return this.request<T>('GET', path, { params, requiresAuth });\n }\n\n async post<T>(path: string, body?: unknown, requiresAuth = true): Promise<T> {\n return this.request<T>('POST', path, { body, requiresAuth });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Agent,\n CreateAgentParams,\n DiscoverResult,\n GenerateKeyResult,\n RecoverKeyResult,\n SplitKeyParams,\n SplitKeyResult,\n} from '../types.js';\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateAgentParams): Promise<Agent> {\n const response = await this.http.post<{ data: Agent }>('/api/v1/agents', params);\n return response.data;\n }\n\n async list(): Promise<Agent[]> {\n const response = await this.http.get<{ data: Agent[] }>('/api/v1/agents');\n return response.data;\n }\n\n async get(uuid: string): Promise<Agent> {\n const response = await this.http.get<{ data: Agent }>(`/api/v1/agents/${uuid}`);\n return response.data;\n }\n\n async discover(fingerprint: string): Promise<DiscoverResult> {\n const response = await this.http.get<{ data: DiscoverResult }>(\n `/api/v1/agents/discover/${fingerprint}`,\n );\n return response.data;\n }\n\n async generateKey(uuid: string): Promise<GenerateKeyResult> {\n const response = await this.http.post<{ data: GenerateKeyResult }>(\n `/api/v1/agents/${uuid}/keys/generate`,\n );\n return response.data;\n }\n\n async splitKey(uuid: string, params: SplitKeyParams): Promise<SplitKeyResult> {\n const response = await this.http.post<{ data: SplitKeyResult }>(\n `/api/v1/agents/${uuid}/keys/split`,\n params,\n );\n return response.data;\n }\n\n async recoverKey(uuid: string, shares: string[]): Promise<RecoverKeyResult> {\n const response = await this.http.post<{ data: RecoverKeyResult }>(\n `/api/v1/agents/${uuid}/keys/recover`,\n { shares },\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n BulkResult,\n CreateEntryParams,\n Entry,\n ListEntriesParams,\n PaginatedEntries,\n UpdateEntryParams,\n} from '../types.js';\n\nexport class EntriesResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(vaultUuid: string, params?: ListEntriesParams): Promise<PaginatedEntries> {\n const response = await this.http.get<{ data: Entry[]; meta: Record<string, unknown> }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n params as Record<string, string | number | boolean | undefined>,\n );\n const pagination = (response.meta?.pagination ?? {}) as PaginatedEntries['pagination'];\n return { entries: response.data, pagination };\n }\n\n async create(vaultUuid: string, entry: CreateEntryParams): Promise<Entry> {\n const response = await this.http.post<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n entry,\n );\n return response.data;\n }\n\n async createBulk(vaultUuid: string, entries: CreateEntryParams[]): Promise<BulkResult> {\n const response = await this.http.post<{\n data: {\n created: Array<{ uuid: string }>;\n failed: BulkResult['failed'];\n summary: { total: number; created: number; failed: number };\n };\n }>(`/api/v1/vaults/${vaultUuid}/entries/bulk`, { entries });\n const d = response.data;\n return {\n imported: d.created.map((e) => e.uuid),\n failed: d.failed,\n summary: { total: d.summary.total, imported: d.summary.created, failed: d.summary.failed },\n };\n }\n\n async get(vaultUuid: string, entryUuid: string): Promise<Entry> {\n const response = await this.http.get<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n );\n return response.data;\n }\n\n async update(vaultUuid: string, entryUuid: string, data: UpdateEntryParams): Promise<Entry> {\n const response = await this.http.put<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n data,\n );\n return response.data;\n }\n\n async delete(vaultUuid: string, entryUuid: string): Promise<void> {\n await this.http.delete<void>(`/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Organization, OrganizationWithKey } from '../types.js';\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(name: string): Promise<OrganizationWithKey> {\n const response = await this.http.post<{ data: Organization & { api_key: string } }>(\n '/api/v1/organizations',\n { name },\n false,\n );\n const { api_key, ...organization } = response.data;\n return { ...organization, apiKey: api_key };\n }\n\n async get(uuid: string): Promise<Organization> {\n const response = await this.http.get<{ data: Organization }>(`/api/v1/organizations/${uuid}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n CreateVaultParams,\n ImportResult,\n MerkleInfo,\n Snapshot,\n Vault,\n VaultExport,\n VaultStats,\n VerifyResult,\n} from '../types.js';\n\n/** Raw snapshot record as returned by the API (field names differ from the public Snapshot type). */\ninterface RawSnapshot {\n snapshot_uuid?: string;\n uuid?: string;\n merkle_root?: string;\n root_hash?: string;\n entry_count?: number;\n storage_bytes?: number;\n created_at?: string;\n}\n\nfunction mapSnapshot(s: RawSnapshot, vaultUuid: string): Snapshot {\n return {\n uuid: (s.snapshot_uuid ?? s.uuid ?? '') as string,\n vault_uuid: vaultUuid,\n root_hash: (s.merkle_root ?? s.root_hash ?? '') as string,\n entry_count: s.entry_count ?? 0,\n storage_bytes: s.storage_bytes ?? 0,\n created_at: s.created_at ?? '',\n };\n}\n\nexport class VaultsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateVaultParams): Promise<Vault> {\n const response = await this.http.post<{ data: Vault }>('/api/v1/vaults', params);\n return response.data;\n }\n\n async list(): Promise<Vault[]> {\n const response = await this.http.get<{ data: Vault[] }>('/api/v1/vaults');\n return response.data;\n }\n\n async get(uuid: string): Promise<Vault> {\n const response = await this.http.get<{ data: Vault }>(`/api/v1/vaults/${uuid}`);\n return response.data;\n }\n\n async stats(uuid: string): Promise<VaultStats> {\n const response = await this.http.get<{ data: VaultStats }>(`/api/v1/vaults/${uuid}/stats`);\n return response.data;\n }\n\n async export(uuid: string): Promise<VaultExport> {\n const response = await this.http.get<{ data: VaultExport }>(`/api/v1/vaults/${uuid}/export`);\n return response.data;\n }\n\n async import(uuid: string, data: VaultExport): Promise<ImportResult> {\n const response = await this.http.post<{ data: ImportResult }>(\n `/api/v1/vaults/${uuid}/import`,\n data,\n );\n return response.data;\n }\n\n async merkle(uuid: string): Promise<MerkleInfo> {\n const response = await this.http.get<{ data: MerkleInfo }>(`/api/v1/vaults/${uuid}/merkle`);\n return response.data;\n }\n\n async verify(uuid: string): Promise<VerifyResult> {\n const response = await this.http.post<{\n data: {\n vault_uuid: string;\n computed_root: string;\n stored_root: string | null;\n is_valid: boolean;\n entry_count: number;\n };\n }>(`/api/v1/vaults/${uuid}/verify`);\n const d = response.data;\n return {\n valid: d.is_valid,\n vault_uuid: d.vault_uuid,\n root_hash: d.computed_root,\n stored_root: d.stored_root,\n entry_count: d.entry_count,\n };\n }\n\n async snapshot(uuid: string): Promise<Snapshot> {\n const response = await this.http.post<{ data: RawSnapshot }>(\n `/api/v1/vaults/${uuid}/snapshot`,\n );\n return mapSnapshot(response.data, uuid);\n }\n\n async snapshots(uuid: string): Promise<Snapshot[]> {\n const response = await this.http.get<{ data: RawSnapshot[] }>(\n `/api/v1/vaults/${uuid}/snapshots`,\n );\n return (response.data ?? []).map((s) => mapSnapshot(s, uuid));\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Main Client\n// ============================================================\n\nimport { HttpClient } from './http.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { EntriesResource } from './resources/entries.js';\nimport { OrganizationsResource } from './resources/organizations.js';\nimport { VaultsResource } from './resources/vaults.js';\nimport type { ImprintClientConfig } from './types.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.agentimprint.io';\n\n/**\n * ImprintClient — main entry point for the Agent Imprint SDK.\n *\n * @example\n * ```ts\n * const client = new ImprintClient({ apiKey: 'your-api-key' });\n * const agents = await client.agents.list();\n * ```\n */\nexport class ImprintClient {\n public readonly organizations: OrganizationsResource;\n public readonly agents: AgentsResource;\n public readonly vaults: VaultsResource;\n public readonly entries: EntriesResource;\n\n private readonly http: HttpClient;\n\n /**\n * Public discovery — check if an agent fingerprint exists (no auth required).\n * Uses the unauthenticated /api/v1/discover endpoint.\n */\n static async probe(fingerprint: string, baseUrl?: string): Promise<{ exists: boolean }> {\n const url = (baseUrl ?? DEFAULT_BASE_URL) + '/api/v1/discover/' + encodeURIComponent(fingerprint);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Discovery probe failed: ' + response.status);\n }\n const json = await response.json() as { data: { exists: boolean } };\n return json.data;\n }\n\n constructor(config: ImprintClientConfig) {\n if (!config.apiKey) {\n throw new Error('ImprintClient: apiKey is required');\n }\n\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.http = new HttpClient(config.apiKey, baseUrl);\n\n this.organizations = new OrganizationsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.vaults = new VaultsResource(this.http);\n this.entries = new EntriesResource(this.http);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Fingerprint Helper\n// Matches server-side algorithm:\n// sha256(model_family + sha256(core_purpose) + creator_identifier)\n// ============================================================\n\nimport type { FingerprintComponents } from './types.js';\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hashBuffer = await getCrypto().subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Compute a deterministic agent fingerprint that matches the server-side algorithm.\n *\n * Algorithm: sha256(model_family + sha256(core_purpose) + creator_identifier)\n */\nexport async function computeFingerprint(params: FingerprintComponents): Promise<string> {\n const { model_family, core_purpose, creator_identifier } = params;\n const purposeHash = await sha256Hex(core_purpose);\n const combined = `${model_family}${purposeHash}${creator_identifier}`;\n return sha256Hex(combined);\n}\n","// ============================================================\n// Agent Imprint SDK — Encryption Helpers (Web Crypto API)\n// Works in Node.js 18+ (globalThis.crypto) and browsers\n// ============================================================\n\nimport type { EncryptedPayload } from './types.js';\n\nconst ALGORITHM = 'AES-GCM';\nconst KEY_LENGTH = 256;\nconst IV_LENGTH = 12; // 96-bit IV for AES-GCM\n\n// ─── Utility ───────────────────────────────────────────────\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function importAesKey(keyHex: string, usages: KeyUsage[]): Promise<CryptoKey> {\n const keyBytes = hexToBytes(keyHex);\n return getCrypto().subtle.importKey('raw', toArrayBuffer(keyBytes), { name: ALGORITHM }, false, usages);\n}\n\n// ─── HKDF Key Derivation ───────────────────────────────────\n\nasync function hkdfDerive(masterKeyHex: string, info: string): Promise<string> {\n const crypto = getCrypto();\n const masterKeyBytes = hexToBytes(masterKeyHex);\n\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n toArrayBuffer(masterKeyBytes),\n { name: 'HKDF' },\n false,\n ['deriveKey'],\n );\n\n const infoBytes = new TextEncoder().encode(info);\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: new Uint8Array(32),\n info: infoBytes,\n },\n baseKey,\n { name: ALGORITHM, length: KEY_LENGTH },\n true,\n ['encrypt', 'decrypt'],\n );\n\n const exported = await crypto.subtle.exportKey('raw', derivedKey);\n return bytesToHex(new Uint8Array(exported));\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Generate a cryptographically secure random 256-bit key (64 hex chars).\n */\nexport function generateKey(): string {\n const bytes = new Uint8Array(32);\n getCrypto().getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\n/**\n * Derive a vault-specific key from a master key and vault UUID.\n */\nexport async function deriveVaultKey(masterKey: string, vaultUuid: string): Promise<string> {\n return hkdfDerive(masterKey, `vault:${vaultUuid}`);\n}\n\n/**\n * Derive an entry-specific key from a vault key and entry UUID.\n */\nexport async function deriveEntryKey(vaultKey: string, entryUuid: string): Promise<string> {\n return hkdfDerive(vaultKey, `entry:${entryUuid}`);\n}\n\n/**\n * Encrypt a JSON-serializable object with AES-256-GCM.\n * Returns an EncryptedPayload with ciphertext, iv, and tag (all hex-encoded).\n */\nexport async function encrypt(keyHex: string, data: object): Promise<EncryptedPayload> {\n const crypto = getCrypto();\n const cryptoKey = await importAesKey(keyHex, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const plaintext = new TextEncoder().encode(JSON.stringify(data));\n\n const ciphertextWithTag = await crypto.subtle.encrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n\n // AES-GCM appends the 16-byte auth tag at the end\n const ciphertextWithTagBytes = new Uint8Array(ciphertextWithTag);\n const ciphertext = ciphertextWithTagBytes.slice(0, -16);\n const tag = ciphertextWithTagBytes.slice(-16);\n\n return {\n ciphertext: bytesToHex(ciphertext),\n iv: bytesToHex(iv),\n tag: bytesToHex(tag),\n algorithm: 'AES-256-GCM',\n };\n}\n\n/**\n * Decrypt an EncryptedPayload back to the original object.\n */\nexport async function decrypt(keyHex: string, payload: EncryptedPayload): Promise<object> {\n const cryptoKey = await importAesKey(keyHex, ['decrypt']);\n const iv = hexToBytes(payload.iv);\n const ciphertext = hexToBytes(payload.ciphertext);\n const tag = hexToBytes(payload.tag);\n\n // Reassemble ciphertext + tag for AES-GCM\n const combined = new Uint8Array(ciphertext.length + tag.length);\n combined.set(ciphertext);\n combined.set(tag, ciphertext.length);\n\n const plaintext = await getCrypto().subtle.decrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(combined),\n );\n\n return JSON.parse(new TextDecoder().decode(plaintext)) as object;\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -117,19 +117,23 @@ interface MerkleInfo {
117
117
  interface VerifyResult {
118
118
  valid: boolean;
119
119
  vault_uuid: string;
120
+ /** The freshly computed Merkle root (server: `computed_root`). */
120
121
  root_hash: string;
121
- mismatched_entries: string[];
122
- verified_at: string;
122
+ /** The last stored Merkle root, or null if none has been persisted yet. */
123
+ stored_root: string | null;
124
+ entry_count: number;
123
125
  }
124
126
  interface Snapshot {
127
+ /** Snapshot id (server: `snapshot_uuid`). */
125
128
  uuid: string;
126
129
  vault_uuid: string;
130
+ /** Merkle root captured at snapshot time (server: `merkle_root`). */
127
131
  root_hash: string;
128
132
  entry_count: number;
129
- metadata: Record<string, unknown>;
133
+ storage_bytes: number;
130
134
  created_at: string;
131
135
  }
132
- type EntryType = 'lesson' | 'heuristic' | 'fact' | 'preference' | 'pattern' | 'relationship' | 'negative' | 'procedural';
136
+ type EntryType = 'lesson' | 'heuristic' | 'fact' | 'preference' | 'pattern' | 'relationship' | 'negative' | 'procedural' | 'note';
133
137
  interface Entry {
134
138
  uuid: string;
135
139
  vault_uuid: string;
package/dist/index.d.ts CHANGED
@@ -117,19 +117,23 @@ interface MerkleInfo {
117
117
  interface VerifyResult {
118
118
  valid: boolean;
119
119
  vault_uuid: string;
120
+ /** The freshly computed Merkle root (server: `computed_root`). */
120
121
  root_hash: string;
121
- mismatched_entries: string[];
122
- verified_at: string;
122
+ /** The last stored Merkle root, or null if none has been persisted yet. */
123
+ stored_root: string | null;
124
+ entry_count: number;
123
125
  }
124
126
  interface Snapshot {
127
+ /** Snapshot id (server: `snapshot_uuid`). */
125
128
  uuid: string;
126
129
  vault_uuid: string;
130
+ /** Merkle root captured at snapshot time (server: `merkle_root`). */
127
131
  root_hash: string;
128
132
  entry_count: number;
129
- metadata: Record<string, unknown>;
133
+ storage_bytes: number;
130
134
  created_at: string;
131
135
  }
132
- type EntryType = 'lesson' | 'heuristic' | 'fact' | 'preference' | 'pattern' | 'relationship' | 'negative' | 'procedural';
136
+ type EntryType = 'lesson' | 'heuristic' | 'fact' | 'preference' | 'pattern' | 'relationship' | 'negative' | 'procedural' | 'note';
133
137
  interface Entry {
134
138
  uuid: string;
135
139
  vault_uuid: string;
package/dist/index.js CHANGED
@@ -172,11 +172,13 @@ var EntriesResource = class {
172
172
  return response.data;
173
173
  }
174
174
  async createBulk(vaultUuid, entries) {
175
- const response = await this.http.post(
176
- `/api/v1/vaults/${vaultUuid}/entries/bulk`,
177
- { entries }
178
- );
179
- return response.data;
175
+ const response = await this.http.post(`/api/v1/vaults/${vaultUuid}/entries/bulk`, { entries });
176
+ const d = response.data;
177
+ return {
178
+ imported: d.created.map((e) => e.uuid),
179
+ failed: d.failed,
180
+ summary: { total: d.summary.total, imported: d.summary.created, failed: d.summary.failed }
181
+ };
180
182
  }
181
183
  async get(vaultUuid, entryUuid) {
182
184
  const response = await this.http.get(
@@ -207,7 +209,8 @@ var OrganizationsResource = class {
207
209
  { name },
208
210
  false
209
211
  );
210
- return { ...response.data, apiKey: response.api_key };
212
+ const { api_key, ...organization } = response.data;
213
+ return { ...organization, apiKey: api_key };
211
214
  }
212
215
  async get(uuid) {
213
216
  const response = await this.http.get(`/api/v1/organizations/${uuid}`);
@@ -216,6 +219,16 @@ var OrganizationsResource = class {
216
219
  };
217
220
 
218
221
  // src/resources/vaults.ts
222
+ function mapSnapshot(s, vaultUuid) {
223
+ return {
224
+ uuid: s.snapshot_uuid ?? s.uuid ?? "",
225
+ vault_uuid: vaultUuid,
226
+ root_hash: s.merkle_root ?? s.root_hash ?? "",
227
+ entry_count: s.entry_count ?? 0,
228
+ storage_bytes: s.storage_bytes ?? 0,
229
+ created_at: s.created_at ?? ""
230
+ };
231
+ }
219
232
  var VaultsResource = class {
220
233
  constructor(http) {
221
234
  this.http = http;
@@ -252,20 +265,27 @@ var VaultsResource = class {
252
265
  return response.data;
253
266
  }
254
267
  async verify(uuid) {
255
- const response = await this.http.post(
256
- `/api/v1/vaults/${uuid}/verify`
257
- );
258
- return response.data;
268
+ const response = await this.http.post(`/api/v1/vaults/${uuid}/verify`);
269
+ const d = response.data;
270
+ return {
271
+ valid: d.is_valid,
272
+ vault_uuid: d.vault_uuid,
273
+ root_hash: d.computed_root,
274
+ stored_root: d.stored_root,
275
+ entry_count: d.entry_count
276
+ };
259
277
  }
260
278
  async snapshot(uuid) {
261
279
  const response = await this.http.post(
262
280
  `/api/v1/vaults/${uuid}/snapshot`
263
281
  );
264
- return response.data;
282
+ return mapSnapshot(response.data, uuid);
265
283
  }
266
284
  async snapshots(uuid) {
267
- const response = await this.http.get(`/api/v1/vaults/${uuid}/snapshots`);
268
- return response.data;
285
+ const response = await this.http.get(
286
+ `/api/v1/vaults/${uuid}/snapshots`
287
+ );
288
+ return (response.data ?? []).map((s) => mapSnapshot(s, uuid));
269
289
  }
270
290
  };
271
291
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/entries.ts","../src/resources/organizations.ts","../src/resources/vaults.ts","../src/client.ts","../src/fingerprint.ts","../src/crypto.ts"],"names":["getCrypto"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================\n// Agent Imprint SDK — Typed Errors\n// ============================================================\n\nexport class ImprintApiError extends Error {\n public readonly status: number;\n public readonly code: string | undefined;\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n body?: unknown,\n code?: string,\n ) {\n super(message);\n this.name = 'ImprintApiError';\n this.status = status;\n this.code = code;\n this.body = body;\n Object.setPrototypeOf(this, ImprintApiError.prototype);\n }\n}\n\nexport class ImprintValidationError extends ImprintApiError {\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]>,\n body?: unknown,\n ) {\n super(message, 422, body, 'VALIDATION_ERROR');\n this.name = 'ImprintValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ImprintValidationError.prototype);\n }\n}\n\nexport class ImprintAuthError extends ImprintApiError {\n constructor(message: string = 'Unauthorized — check your API key', body?: unknown) {\n super(message, 401, body, 'AUTH_ERROR');\n this.name = 'ImprintAuthError';\n Object.setPrototypeOf(this, ImprintAuthError.prototype);\n }\n}\n\nexport class ImprintNotFoundError extends ImprintApiError {\n constructor(message: string = 'Resource not found', body?: unknown) {\n super(message, 404, body, 'NOT_FOUND');\n this.name = 'ImprintNotFoundError';\n Object.setPrototypeOf(this, ImprintNotFoundError.prototype);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — HTTP Transport\n// ============================================================\n\nimport {\n ImprintApiError,\n ImprintAuthError,\n ImprintNotFoundError,\n ImprintValidationError,\n} from './errors.js';\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(apiKey: string, baseUrl: string) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n requiresAuth?: boolean;\n } = {},\n ): Promise<T> {\n const { body, params, requiresAuth = true } = options;\n const url = this.buildUrl(path, params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n\n if (requiresAuth) {\n headers['X-API-Key'] = this.apiKey;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n await this.throwError(response.status, responseBody);\n }\n\n return responseBody as T;\n }\n\n private async throwError(status: number, body: unknown): Promise<never> {\n const bodyObj = typeof body === 'object' && body !== null ? body as Record<string, unknown> : {};\n const message = typeof bodyObj['message'] === 'string' ? bodyObj['message'] : `HTTP ${status}`;\n\n switch (status) {\n case 401:\n throw new ImprintAuthError(message, body);\n case 404:\n throw new ImprintNotFoundError(message, body);\n case 422: {\n const errors = (bodyObj['errors'] as Record<string, string[]>) ?? {};\n throw new ImprintValidationError(message, errors, body);\n }\n default:\n throw new ImprintApiError(message, status, body);\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, requiresAuth = true): Promise<T> {\n return this.request<T>('GET', path, { params, requiresAuth });\n }\n\n async post<T>(path: string, body?: unknown, requiresAuth = true): Promise<T> {\n return this.request<T>('POST', path, { body, requiresAuth });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Agent,\n CreateAgentParams,\n DiscoverResult,\n GenerateKeyResult,\n RecoverKeyResult,\n SplitKeyParams,\n SplitKeyResult,\n} from '../types.js';\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateAgentParams): Promise<Agent> {\n const response = await this.http.post<{ data: Agent }>('/api/v1/agents', params);\n return response.data;\n }\n\n async list(): Promise<Agent[]> {\n const response = await this.http.get<{ data: Agent[] }>('/api/v1/agents');\n return response.data;\n }\n\n async get(uuid: string): Promise<Agent> {\n const response = await this.http.get<{ data: Agent }>(`/api/v1/agents/${uuid}`);\n return response.data;\n }\n\n async discover(fingerprint: string): Promise<DiscoverResult> {\n const response = await this.http.get<{ data: DiscoverResult }>(\n `/api/v1/agents/discover/${fingerprint}`,\n );\n return response.data;\n }\n\n async generateKey(uuid: string): Promise<GenerateKeyResult> {\n const response = await this.http.post<{ data: GenerateKeyResult }>(\n `/api/v1/agents/${uuid}/keys/generate`,\n );\n return response.data;\n }\n\n async splitKey(uuid: string, params: SplitKeyParams): Promise<SplitKeyResult> {\n const response = await this.http.post<{ data: SplitKeyResult }>(\n `/api/v1/agents/${uuid}/keys/split`,\n params,\n );\n return response.data;\n }\n\n async recoverKey(uuid: string, shares: string[]): Promise<RecoverKeyResult> {\n const response = await this.http.post<{ data: RecoverKeyResult }>(\n `/api/v1/agents/${uuid}/keys/recover`,\n { shares },\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n BulkResult,\n CreateEntryParams,\n Entry,\n ListEntriesParams,\n PaginatedEntries,\n UpdateEntryParams,\n} from '../types.js';\n\nexport class EntriesResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(vaultUuid: string, params?: ListEntriesParams): Promise<PaginatedEntries> {\n const response = await this.http.get<{ data: Entry[]; meta: Record<string, unknown> }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n params as Record<string, string | number | boolean | undefined>,\n );\n const pagination = (response.meta?.pagination ?? {}) as PaginatedEntries['pagination'];\n return { entries: response.data, pagination };\n }\n\n async create(vaultUuid: string, entry: CreateEntryParams): Promise<Entry> {\n const response = await this.http.post<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n entry,\n );\n return response.data;\n }\n\n async createBulk(vaultUuid: string, entries: CreateEntryParams[]): Promise<BulkResult> {\n const response = await this.http.post<{ data: BulkResult }>(\n `/api/v1/vaults/${vaultUuid}/entries/bulk`,\n { entries },\n );\n return response.data;\n }\n\n async get(vaultUuid: string, entryUuid: string): Promise<Entry> {\n const response = await this.http.get<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n );\n return response.data;\n }\n\n async update(vaultUuid: string, entryUuid: string, data: UpdateEntryParams): Promise<Entry> {\n const response = await this.http.put<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n data,\n );\n return response.data;\n }\n\n async delete(vaultUuid: string, entryUuid: string): Promise<void> {\n await this.http.delete<void>(`/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Organization, OrganizationWithKey } from '../types.js';\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(name: string): Promise<OrganizationWithKey> {\n const response = await this.http.post<{ data: Organization; api_key: string }>(\n '/api/v1/organizations',\n { name },\n false,\n );\n return { ...response.data, apiKey: response.api_key };\n }\n\n async get(uuid: string): Promise<Organization> {\n const response = await this.http.get<{ data: Organization }>(`/api/v1/organizations/${uuid}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n CreateVaultParams,\n ImportResult,\n MerkleInfo,\n Snapshot,\n Vault,\n VaultExport,\n VaultStats,\n VerifyResult,\n} from '../types.js';\n\nexport class VaultsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateVaultParams): Promise<Vault> {\n const response = await this.http.post<{ data: Vault }>('/api/v1/vaults', params);\n return response.data;\n }\n\n async list(): Promise<Vault[]> {\n const response = await this.http.get<{ data: Vault[] }>('/api/v1/vaults');\n return response.data;\n }\n\n async get(uuid: string): Promise<Vault> {\n const response = await this.http.get<{ data: Vault }>(`/api/v1/vaults/${uuid}`);\n return response.data;\n }\n\n async stats(uuid: string): Promise<VaultStats> {\n const response = await this.http.get<{ data: VaultStats }>(`/api/v1/vaults/${uuid}/stats`);\n return response.data;\n }\n\n async export(uuid: string): Promise<VaultExport> {\n const response = await this.http.get<{ data: VaultExport }>(`/api/v1/vaults/${uuid}/export`);\n return response.data;\n }\n\n async import(uuid: string, data: VaultExport): Promise<ImportResult> {\n const response = await this.http.post<{ data: ImportResult }>(\n `/api/v1/vaults/${uuid}/import`,\n data,\n );\n return response.data;\n }\n\n async merkle(uuid: string): Promise<MerkleInfo> {\n const response = await this.http.get<{ data: MerkleInfo }>(`/api/v1/vaults/${uuid}/merkle`);\n return response.data;\n }\n\n async verify(uuid: string): Promise<VerifyResult> {\n const response = await this.http.post<{ data: VerifyResult }>(\n `/api/v1/vaults/${uuid}/verify`,\n );\n return response.data;\n }\n\n async snapshot(uuid: string): Promise<Snapshot> {\n const response = await this.http.post<{ data: Snapshot }>(\n `/api/v1/vaults/${uuid}/snapshot`,\n );\n return response.data;\n }\n\n async snapshots(uuid: string): Promise<Snapshot[]> {\n const response = await this.http.get<{ data: Snapshot[] }>(`/api/v1/vaults/${uuid}/snapshots`);\n return response.data;\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Main Client\n// ============================================================\n\nimport { HttpClient } from './http.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { EntriesResource } from './resources/entries.js';\nimport { OrganizationsResource } from './resources/organizations.js';\nimport { VaultsResource } from './resources/vaults.js';\nimport type { ImprintClientConfig } from './types.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.agentimprint.io';\n\n/**\n * ImprintClient — main entry point for the Agent Imprint SDK.\n *\n * @example\n * ```ts\n * const client = new ImprintClient({ apiKey: 'your-api-key' });\n * const agents = await client.agents.list();\n * ```\n */\nexport class ImprintClient {\n public readonly organizations: OrganizationsResource;\n public readonly agents: AgentsResource;\n public readonly vaults: VaultsResource;\n public readonly entries: EntriesResource;\n\n private readonly http: HttpClient;\n\n /**\n * Public discovery — check if an agent fingerprint exists (no auth required).\n * Uses the unauthenticated /api/v1/discover endpoint.\n */\n static async probe(fingerprint: string, baseUrl?: string): Promise<{ exists: boolean }> {\n const url = (baseUrl ?? DEFAULT_BASE_URL) + '/api/v1/discover/' + encodeURIComponent(fingerprint);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Discovery probe failed: ' + response.status);\n }\n const json = await response.json() as { data: { exists: boolean } };\n return json.data;\n }\n\n constructor(config: ImprintClientConfig) {\n if (!config.apiKey) {\n throw new Error('ImprintClient: apiKey is required');\n }\n\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.http = new HttpClient(config.apiKey, baseUrl);\n\n this.organizations = new OrganizationsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.vaults = new VaultsResource(this.http);\n this.entries = new EntriesResource(this.http);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Fingerprint Helper\n// Matches server-side algorithm:\n// sha256(model_family + sha256(core_purpose) + creator_identifier)\n// ============================================================\n\nimport type { FingerprintComponents } from './types.js';\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hashBuffer = await getCrypto().subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Compute a deterministic agent fingerprint that matches the server-side algorithm.\n *\n * Algorithm: sha256(model_family + sha256(core_purpose) + creator_identifier)\n */\nexport async function computeFingerprint(params: FingerprintComponents): Promise<string> {\n const { model_family, core_purpose, creator_identifier } = params;\n const purposeHash = await sha256Hex(core_purpose);\n const combined = `${model_family}${purposeHash}${creator_identifier}`;\n return sha256Hex(combined);\n}\n","// ============================================================\n// Agent Imprint SDK — Encryption Helpers (Web Crypto API)\n// Works in Node.js 18+ (globalThis.crypto) and browsers\n// ============================================================\n\nimport type { EncryptedPayload } from './types.js';\n\nconst ALGORITHM = 'AES-GCM';\nconst KEY_LENGTH = 256;\nconst IV_LENGTH = 12; // 96-bit IV for AES-GCM\n\n// ─── Utility ───────────────────────────────────────────────\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function importAesKey(keyHex: string, usages: KeyUsage[]): Promise<CryptoKey> {\n const keyBytes = hexToBytes(keyHex);\n return getCrypto().subtle.importKey('raw', toArrayBuffer(keyBytes), { name: ALGORITHM }, false, usages);\n}\n\n// ─── HKDF Key Derivation ───────────────────────────────────\n\nasync function hkdfDerive(masterKeyHex: string, info: string): Promise<string> {\n const crypto = getCrypto();\n const masterKeyBytes = hexToBytes(masterKeyHex);\n\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n toArrayBuffer(masterKeyBytes),\n { name: 'HKDF' },\n false,\n ['deriveKey'],\n );\n\n const infoBytes = new TextEncoder().encode(info);\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: new Uint8Array(32),\n info: infoBytes,\n },\n baseKey,\n { name: ALGORITHM, length: KEY_LENGTH },\n true,\n ['encrypt', 'decrypt'],\n );\n\n const exported = await crypto.subtle.exportKey('raw', derivedKey);\n return bytesToHex(new Uint8Array(exported));\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Generate a cryptographically secure random 256-bit key (64 hex chars).\n */\nexport function generateKey(): string {\n const bytes = new Uint8Array(32);\n getCrypto().getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\n/**\n * Derive a vault-specific key from a master key and vault UUID.\n */\nexport async function deriveVaultKey(masterKey: string, vaultUuid: string): Promise<string> {\n return hkdfDerive(masterKey, `vault:${vaultUuid}`);\n}\n\n/**\n * Derive an entry-specific key from a vault key and entry UUID.\n */\nexport async function deriveEntryKey(vaultKey: string, entryUuid: string): Promise<string> {\n return hkdfDerive(vaultKey, `entry:${entryUuid}`);\n}\n\n/**\n * Encrypt a JSON-serializable object with AES-256-GCM.\n * Returns an EncryptedPayload with ciphertext, iv, and tag (all hex-encoded).\n */\nexport async function encrypt(keyHex: string, data: object): Promise<EncryptedPayload> {\n const crypto = getCrypto();\n const cryptoKey = await importAesKey(keyHex, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const plaintext = new TextEncoder().encode(JSON.stringify(data));\n\n const ciphertextWithTag = await crypto.subtle.encrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n\n // AES-GCM appends the 16-byte auth tag at the end\n const ciphertextWithTagBytes = new Uint8Array(ciphertextWithTag);\n const ciphertext = ciphertextWithTagBytes.slice(0, -16);\n const tag = ciphertextWithTagBytes.slice(-16);\n\n return {\n ciphertext: bytesToHex(ciphertext),\n iv: bytesToHex(iv),\n tag: bytesToHex(tag),\n algorithm: 'AES-256-GCM',\n };\n}\n\n/**\n * Decrypt an EncryptedPayload back to the original object.\n */\nexport async function decrypt(keyHex: string, payload: EncryptedPayload): Promise<object> {\n const cryptoKey = await importAesKey(keyHex, ['decrypt']);\n const iv = hexToBytes(payload.iv);\n const ciphertext = hexToBytes(payload.ciphertext);\n const tag = hexToBytes(payload.tag);\n\n // Reassemble ciphertext + tag for AES-GCM\n const combined = new Uint8Array(ciphertext.length + tag.length);\n combined.set(ciphertext);\n combined.set(tag, ciphertext.length);\n\n const plaintext = await getCrypto().subtle.decrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(combined),\n );\n\n return JSON.parse(new TextDecoder().decode(plaintext)) as object;\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/agents.ts","../src/resources/entries.ts","../src/resources/organizations.ts","../src/resources/vaults.ts","../src/client.ts","../src/fingerprint.ts","../src/crypto.ts"],"names":["getCrypto"],"mappings":"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","file":"index.js","sourcesContent":["// ============================================================\n// Agent Imprint SDK — Typed Errors\n// ============================================================\n\nexport class ImprintApiError extends Error {\n public readonly status: number;\n public readonly code: string | undefined;\n public readonly body: unknown;\n\n constructor(\n message: string,\n status: number,\n body?: unknown,\n code?: string,\n ) {\n super(message);\n this.name = 'ImprintApiError';\n this.status = status;\n this.code = code;\n this.body = body;\n Object.setPrototypeOf(this, ImprintApiError.prototype);\n }\n}\n\nexport class ImprintValidationError extends ImprintApiError {\n public readonly errors: Record<string, string[]>;\n\n constructor(\n message: string,\n errors: Record<string, string[]>,\n body?: unknown,\n ) {\n super(message, 422, body, 'VALIDATION_ERROR');\n this.name = 'ImprintValidationError';\n this.errors = errors;\n Object.setPrototypeOf(this, ImprintValidationError.prototype);\n }\n}\n\nexport class ImprintAuthError extends ImprintApiError {\n constructor(message: string = 'Unauthorized — check your API key', body?: unknown) {\n super(message, 401, body, 'AUTH_ERROR');\n this.name = 'ImprintAuthError';\n Object.setPrototypeOf(this, ImprintAuthError.prototype);\n }\n}\n\nexport class ImprintNotFoundError extends ImprintApiError {\n constructor(message: string = 'Resource not found', body?: unknown) {\n super(message, 404, body, 'NOT_FOUND');\n this.name = 'ImprintNotFoundError';\n Object.setPrototypeOf(this, ImprintNotFoundError.prototype);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — HTTP Transport\n// ============================================================\n\nimport {\n ImprintApiError,\n ImprintAuthError,\n ImprintNotFoundError,\n ImprintValidationError,\n} from './errors.js';\n\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n constructor(apiKey: string, baseUrl: string) {\n this.apiKey = apiKey;\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n body?: unknown;\n params?: Record<string, string | number | boolean | undefined>;\n requiresAuth?: boolean;\n } = {},\n ): Promise<T> {\n const { body, params, requiresAuth = true } = options;\n const url = this.buildUrl(path, params);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n };\n\n if (requiresAuth) {\n headers['X-API-Key'] = this.apiKey;\n }\n\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n await this.throwError(response.status, responseBody);\n }\n\n return responseBody as T;\n }\n\n private async throwError(status: number, body: unknown): Promise<never> {\n const bodyObj = typeof body === 'object' && body !== null ? body as Record<string, unknown> : {};\n const message = typeof bodyObj['message'] === 'string' ? bodyObj['message'] : `HTTP ${status}`;\n\n switch (status) {\n case 401:\n throw new ImprintAuthError(message, body);\n case 404:\n throw new ImprintNotFoundError(message, body);\n case 422: {\n const errors = (bodyObj['errors'] as Record<string, string[]>) ?? {};\n throw new ImprintValidationError(message, errors, body);\n }\n default:\n throw new ImprintApiError(message, status, body);\n }\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>, requiresAuth = true): Promise<T> {\n return this.request<T>('GET', path, { params, requiresAuth });\n }\n\n async post<T>(path: string, body?: unknown, requiresAuth = true): Promise<T> {\n return this.request<T>('POST', path, { body, requiresAuth });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, { body });\n }\n\n async delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Agent,\n CreateAgentParams,\n DiscoverResult,\n GenerateKeyResult,\n RecoverKeyResult,\n SplitKeyParams,\n SplitKeyResult,\n} from '../types.js';\n\nexport class AgentsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateAgentParams): Promise<Agent> {\n const response = await this.http.post<{ data: Agent }>('/api/v1/agents', params);\n return response.data;\n }\n\n async list(): Promise<Agent[]> {\n const response = await this.http.get<{ data: Agent[] }>('/api/v1/agents');\n return response.data;\n }\n\n async get(uuid: string): Promise<Agent> {\n const response = await this.http.get<{ data: Agent }>(`/api/v1/agents/${uuid}`);\n return response.data;\n }\n\n async discover(fingerprint: string): Promise<DiscoverResult> {\n const response = await this.http.get<{ data: DiscoverResult }>(\n `/api/v1/agents/discover/${fingerprint}`,\n );\n return response.data;\n }\n\n async generateKey(uuid: string): Promise<GenerateKeyResult> {\n const response = await this.http.post<{ data: GenerateKeyResult }>(\n `/api/v1/agents/${uuid}/keys/generate`,\n );\n return response.data;\n }\n\n async splitKey(uuid: string, params: SplitKeyParams): Promise<SplitKeyResult> {\n const response = await this.http.post<{ data: SplitKeyResult }>(\n `/api/v1/agents/${uuid}/keys/split`,\n params,\n );\n return response.data;\n }\n\n async recoverKey(uuid: string, shares: string[]): Promise<RecoverKeyResult> {\n const response = await this.http.post<{ data: RecoverKeyResult }>(\n `/api/v1/agents/${uuid}/keys/recover`,\n { shares },\n );\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n BulkResult,\n CreateEntryParams,\n Entry,\n ListEntriesParams,\n PaginatedEntries,\n UpdateEntryParams,\n} from '../types.js';\n\nexport class EntriesResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(vaultUuid: string, params?: ListEntriesParams): Promise<PaginatedEntries> {\n const response = await this.http.get<{ data: Entry[]; meta: Record<string, unknown> }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n params as Record<string, string | number | boolean | undefined>,\n );\n const pagination = (response.meta?.pagination ?? {}) as PaginatedEntries['pagination'];\n return { entries: response.data, pagination };\n }\n\n async create(vaultUuid: string, entry: CreateEntryParams): Promise<Entry> {\n const response = await this.http.post<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries`,\n entry,\n );\n return response.data;\n }\n\n async createBulk(vaultUuid: string, entries: CreateEntryParams[]): Promise<BulkResult> {\n const response = await this.http.post<{\n data: {\n created: Array<{ uuid: string }>;\n failed: BulkResult['failed'];\n summary: { total: number; created: number; failed: number };\n };\n }>(`/api/v1/vaults/${vaultUuid}/entries/bulk`, { entries });\n const d = response.data;\n return {\n imported: d.created.map((e) => e.uuid),\n failed: d.failed,\n summary: { total: d.summary.total, imported: d.summary.created, failed: d.summary.failed },\n };\n }\n\n async get(vaultUuid: string, entryUuid: string): Promise<Entry> {\n const response = await this.http.get<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n );\n return response.data;\n }\n\n async update(vaultUuid: string, entryUuid: string, data: UpdateEntryParams): Promise<Entry> {\n const response = await this.http.put<{ data: Entry }>(\n `/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`,\n data,\n );\n return response.data;\n }\n\n async delete(vaultUuid: string, entryUuid: string): Promise<void> {\n await this.http.delete<void>(`/api/v1/vaults/${vaultUuid}/entries/${entryUuid}`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { Organization, OrganizationWithKey } from '../types.js';\n\nexport class OrganizationsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(name: string): Promise<OrganizationWithKey> {\n const response = await this.http.post<{ data: Organization & { api_key: string } }>(\n '/api/v1/organizations',\n { name },\n false,\n );\n const { api_key, ...organization } = response.data;\n return { ...organization, apiKey: api_key };\n }\n\n async get(uuid: string): Promise<Organization> {\n const response = await this.http.get<{ data: Organization }>(`/api/v1/organizations/${uuid}`);\n return response.data;\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n CreateVaultParams,\n ImportResult,\n MerkleInfo,\n Snapshot,\n Vault,\n VaultExport,\n VaultStats,\n VerifyResult,\n} from '../types.js';\n\n/** Raw snapshot record as returned by the API (field names differ from the public Snapshot type). */\ninterface RawSnapshot {\n snapshot_uuid?: string;\n uuid?: string;\n merkle_root?: string;\n root_hash?: string;\n entry_count?: number;\n storage_bytes?: number;\n created_at?: string;\n}\n\nfunction mapSnapshot(s: RawSnapshot, vaultUuid: string): Snapshot {\n return {\n uuid: (s.snapshot_uuid ?? s.uuid ?? '') as string,\n vault_uuid: vaultUuid,\n root_hash: (s.merkle_root ?? s.root_hash ?? '') as string,\n entry_count: s.entry_count ?? 0,\n storage_bytes: s.storage_bytes ?? 0,\n created_at: s.created_at ?? '',\n };\n}\n\nexport class VaultsResource {\n constructor(private readonly http: HttpClient) {}\n\n async create(params: CreateVaultParams): Promise<Vault> {\n const response = await this.http.post<{ data: Vault }>('/api/v1/vaults', params);\n return response.data;\n }\n\n async list(): Promise<Vault[]> {\n const response = await this.http.get<{ data: Vault[] }>('/api/v1/vaults');\n return response.data;\n }\n\n async get(uuid: string): Promise<Vault> {\n const response = await this.http.get<{ data: Vault }>(`/api/v1/vaults/${uuid}`);\n return response.data;\n }\n\n async stats(uuid: string): Promise<VaultStats> {\n const response = await this.http.get<{ data: VaultStats }>(`/api/v1/vaults/${uuid}/stats`);\n return response.data;\n }\n\n async export(uuid: string): Promise<VaultExport> {\n const response = await this.http.get<{ data: VaultExport }>(`/api/v1/vaults/${uuid}/export`);\n return response.data;\n }\n\n async import(uuid: string, data: VaultExport): Promise<ImportResult> {\n const response = await this.http.post<{ data: ImportResult }>(\n `/api/v1/vaults/${uuid}/import`,\n data,\n );\n return response.data;\n }\n\n async merkle(uuid: string): Promise<MerkleInfo> {\n const response = await this.http.get<{ data: MerkleInfo }>(`/api/v1/vaults/${uuid}/merkle`);\n return response.data;\n }\n\n async verify(uuid: string): Promise<VerifyResult> {\n const response = await this.http.post<{\n data: {\n vault_uuid: string;\n computed_root: string;\n stored_root: string | null;\n is_valid: boolean;\n entry_count: number;\n };\n }>(`/api/v1/vaults/${uuid}/verify`);\n const d = response.data;\n return {\n valid: d.is_valid,\n vault_uuid: d.vault_uuid,\n root_hash: d.computed_root,\n stored_root: d.stored_root,\n entry_count: d.entry_count,\n };\n }\n\n async snapshot(uuid: string): Promise<Snapshot> {\n const response = await this.http.post<{ data: RawSnapshot }>(\n `/api/v1/vaults/${uuid}/snapshot`,\n );\n return mapSnapshot(response.data, uuid);\n }\n\n async snapshots(uuid: string): Promise<Snapshot[]> {\n const response = await this.http.get<{ data: RawSnapshot[] }>(\n `/api/v1/vaults/${uuid}/snapshots`,\n );\n return (response.data ?? []).map((s) => mapSnapshot(s, uuid));\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Main Client\n// ============================================================\n\nimport { HttpClient } from './http.js';\nimport { AgentsResource } from './resources/agents.js';\nimport { EntriesResource } from './resources/entries.js';\nimport { OrganizationsResource } from './resources/organizations.js';\nimport { VaultsResource } from './resources/vaults.js';\nimport type { ImprintClientConfig } from './types.js';\n\nexport const DEFAULT_BASE_URL = 'https://api.agentimprint.io';\n\n/**\n * ImprintClient — main entry point for the Agent Imprint SDK.\n *\n * @example\n * ```ts\n * const client = new ImprintClient({ apiKey: 'your-api-key' });\n * const agents = await client.agents.list();\n * ```\n */\nexport class ImprintClient {\n public readonly organizations: OrganizationsResource;\n public readonly agents: AgentsResource;\n public readonly vaults: VaultsResource;\n public readonly entries: EntriesResource;\n\n private readonly http: HttpClient;\n\n /**\n * Public discovery — check if an agent fingerprint exists (no auth required).\n * Uses the unauthenticated /api/v1/discover endpoint.\n */\n static async probe(fingerprint: string, baseUrl?: string): Promise<{ exists: boolean }> {\n const url = (baseUrl ?? DEFAULT_BASE_URL) + '/api/v1/discover/' + encodeURIComponent(fingerprint);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error('Discovery probe failed: ' + response.status);\n }\n const json = await response.json() as { data: { exists: boolean } };\n return json.data;\n }\n\n constructor(config: ImprintClientConfig) {\n if (!config.apiKey) {\n throw new Error('ImprintClient: apiKey is required');\n }\n\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n this.http = new HttpClient(config.apiKey, baseUrl);\n\n this.organizations = new OrganizationsResource(this.http);\n this.agents = new AgentsResource(this.http);\n this.vaults = new VaultsResource(this.http);\n this.entries = new EntriesResource(this.http);\n }\n}\n","// ============================================================\n// Agent Imprint SDK — Fingerprint Helper\n// Matches server-side algorithm:\n// sha256(model_family + sha256(core_purpose) + creator_identifier)\n// ============================================================\n\nimport type { FingerprintComponents } from './types.js';\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const hashBuffer = await getCrypto().subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Compute a deterministic agent fingerprint that matches the server-side algorithm.\n *\n * Algorithm: sha256(model_family + sha256(core_purpose) + creator_identifier)\n */\nexport async function computeFingerprint(params: FingerprintComponents): Promise<string> {\n const { model_family, core_purpose, creator_identifier } = params;\n const purposeHash = await sha256Hex(core_purpose);\n const combined = `${model_family}${purposeHash}${creator_identifier}`;\n return sha256Hex(combined);\n}\n","// ============================================================\n// Agent Imprint SDK — Encryption Helpers (Web Crypto API)\n// Works in Node.js 18+ (globalThis.crypto) and browsers\n// ============================================================\n\nimport type { EncryptedPayload } from './types.js';\n\nconst ALGORITHM = 'AES-GCM';\nconst KEY_LENGTH = 256;\nconst IV_LENGTH = 12; // 96-bit IV for AES-GCM\n\n// ─── Utility ───────────────────────────────────────────────\n\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\nfunction getCrypto(): Crypto {\n if (typeof globalThis !== 'undefined' && globalThis.crypto) {\n return globalThis.crypto;\n }\n throw new Error('Web Crypto API not available in this environment');\n}\n\nasync function importAesKey(keyHex: string, usages: KeyUsage[]): Promise<CryptoKey> {\n const keyBytes = hexToBytes(keyHex);\n return getCrypto().subtle.importKey('raw', toArrayBuffer(keyBytes), { name: ALGORITHM }, false, usages);\n}\n\n// ─── HKDF Key Derivation ───────────────────────────────────\n\nasync function hkdfDerive(masterKeyHex: string, info: string): Promise<string> {\n const crypto = getCrypto();\n const masterKeyBytes = hexToBytes(masterKeyHex);\n\n const baseKey = await crypto.subtle.importKey(\n 'raw',\n toArrayBuffer(masterKeyBytes),\n { name: 'HKDF' },\n false,\n ['deriveKey'],\n );\n\n const infoBytes = new TextEncoder().encode(info);\n const derivedKey = await crypto.subtle.deriveKey(\n {\n name: 'HKDF',\n hash: 'SHA-256',\n salt: new Uint8Array(32),\n info: infoBytes,\n },\n baseKey,\n { name: ALGORITHM, length: KEY_LENGTH },\n true,\n ['encrypt', 'decrypt'],\n );\n\n const exported = await crypto.subtle.exportKey('raw', derivedKey);\n return bytesToHex(new Uint8Array(exported));\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Generate a cryptographically secure random 256-bit key (64 hex chars).\n */\nexport function generateKey(): string {\n const bytes = new Uint8Array(32);\n getCrypto().getRandomValues(bytes);\n return bytesToHex(bytes);\n}\n\n/**\n * Derive a vault-specific key from a master key and vault UUID.\n */\nexport async function deriveVaultKey(masterKey: string, vaultUuid: string): Promise<string> {\n return hkdfDerive(masterKey, `vault:${vaultUuid}`);\n}\n\n/**\n * Derive an entry-specific key from a vault key and entry UUID.\n */\nexport async function deriveEntryKey(vaultKey: string, entryUuid: string): Promise<string> {\n return hkdfDerive(vaultKey, `entry:${entryUuid}`);\n}\n\n/**\n * Encrypt a JSON-serializable object with AES-256-GCM.\n * Returns an EncryptedPayload with ciphertext, iv, and tag (all hex-encoded).\n */\nexport async function encrypt(keyHex: string, data: object): Promise<EncryptedPayload> {\n const crypto = getCrypto();\n const cryptoKey = await importAesKey(keyHex, ['encrypt']);\n const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));\n const plaintext = new TextEncoder().encode(JSON.stringify(data));\n\n const ciphertextWithTag = await crypto.subtle.encrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(plaintext),\n );\n\n // AES-GCM appends the 16-byte auth tag at the end\n const ciphertextWithTagBytes = new Uint8Array(ciphertextWithTag);\n const ciphertext = ciphertextWithTagBytes.slice(0, -16);\n const tag = ciphertextWithTagBytes.slice(-16);\n\n return {\n ciphertext: bytesToHex(ciphertext),\n iv: bytesToHex(iv),\n tag: bytesToHex(tag),\n algorithm: 'AES-256-GCM',\n };\n}\n\n/**\n * Decrypt an EncryptedPayload back to the original object.\n */\nexport async function decrypt(keyHex: string, payload: EncryptedPayload): Promise<object> {\n const cryptoKey = await importAesKey(keyHex, ['decrypt']);\n const iv = hexToBytes(payload.iv);\n const ciphertext = hexToBytes(payload.ciphertext);\n const tag = hexToBytes(payload.tag);\n\n // Reassemble ciphertext + tag for AES-GCM\n const combined = new Uint8Array(ciphertext.length + tag.length);\n combined.set(ciphertext);\n combined.set(tag, ciphertext.length);\n\n const plaintext = await getCrypto().subtle.decrypt(\n { name: ALGORITHM, iv: toArrayBuffer(iv) },\n cryptoKey,\n toArrayBuffer(combined),\n );\n\n return JSON.parse(new TextDecoder().decode(plaintext)) as object;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentimprint/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "TypeScript SDK for the Agent Imprint sovereign memory infrastructure API",
5
5
  "author": "CooperAssistant",
6
6
  "license": "MIT",